Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailemVyřešeno Java - Jak získat objekty v určené oblasti

Dobrý den,

StackPane root = new StackPane();
ArrayList<Object> list = new ArrayList();
list.addAll(root.getChildren().stream().filter((f) -> f.getLayoutX() >= 0 && f.getLayoutX() <= 100 && f.getLayoutY() >= 0 && f.getLayoutY() <= 100).collect(Collectors.toList()));

Pochopitelně jsem do root přidal prvky. Tenhle kód vrátí pole objektů, které mají LayoutX a LayoutY 0-100.

Chci se jenom zeptat, prosím Vás, zeptat, jestli je to správný způsob, jak tohle řešit?

Děkuji

Jsou zobrazeny jen nové odpovědi. Zobrazit všechny
Předmět Autor Datum
S JavaFX som nerobil, ale tak vo všeobecnosti potrebuješ zistiť, či sa určená oblasť pretína s oblas…
moose 14.10.2018 23:33
moose
Ještě jsem zapomněl, že potřebuji odfiltrovat zmíněný StackPane. Jenže, jak takový filtr, prosím Vá…
MichalDM 15.10.2018 16:21
MichalDM
Něco takového by nefungovalo? .filter(node -> !(node instanceof StackPane))
Wikan 15.10.2018 16:28
Wikan
Díky, to jsem potřeboval. nový
MichalDM 17.10.2018 17:50
MichalDM
Ještě potřebuji jednu věc ... Button btn = new Button("Say Hello World"); btn.setLayoutX(50); btn.s…
MichalDM 17.10.2018 17:50
MichalDM
Používal jsem nevhodný objekt. Tlačítko má totiž nulovou velikost (nevím proč). intersects to sebr… poslední
MichalDM 03.11.2018 12:14
MichalDM

S JavaFX som nerobil, ale tak vo všeobecnosti potrebuješ zistiť, či sa určená oblasť pretína s oblasťou daného prvku.

Zo zbežného googlenia, oblasť daného prvku získaš pomocou volania node.localToScene(node.getBoundsInLocal()) alebo node.localToScreen(node.getBoundsInLocal()). Či sa oblasti pretínajú zistíš volaním metódy bounds.intersects(otherBounds). Obidve oblasti musia byť samozrejme v rovnakom súradnicovom systéme.

Takže asi takto:

final BoundingBox boundingBox = new BoundingBox(100, 100, 200, 200);
final List<Node> list = root.getChildren().stream()
        .filter(node -> boundingBox.intersects(node.localToScene(node.getBoundsInLocal())))
        .collect(Collectors.toList());

Netestované, s JavaFX som nerobil, ale skúsil by som to takto.

Ještě potřebuji jednu věc

...
Button btn = new Button("Say Hello World");
btn.setLayoutX(50);
btn.setLayoutY(50);
Pane root = new Pane();
root.getChildren().add(btn);    
Scene scene = new Scene(root, 300, 250);
BoundingBox boundingBox = new BoundingBox(0, 0, 50, 50);
List<Node> list = root.getChildren().stream().filter(node -> boundingBox.intersects(node.localToScene(node.getBoundsInLocal()))).collect(Collectors.toList());
System.out.println(list.toString());
...

Teď mě to vypíše to tlačítko, protože BoundingBox do něj zasahuje.

Potřeboval bych ale, aby za určitých okolností, bral objekty, které do plochy kompletně zasahují (ne pouze částečně).

BoundingBox má metodu contains, takže pokud ji nahradím místo intersects, tak by to mělo vrátit "[]".

Výsledek se však nezmění.

Co, prosím Vás, dělám špatně?

Používal jsem nevhodný objekt.

Tlačítko má totiž nulovou velikost (nevím proč).

intersects to sebral, protože do oblasti zasahuje.
contains to ale sebralo taky, protože má nulovou velikost, takže do oblasti zasahuje celé.

Takže to fungovalo správně, ale z logického hlediska to nedává smysl.

Když tlačítko změním třeba na Rectangle (kde musím zadat velikost), tak už to funguje správně.

Zpět do poradny Odpovědět na původní otázku Nahoru