IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Jak udělat, aby se dočasně jeden node vykresloval nad ostatními v JavaFX?

V předchozím kvízu, Online test znalostí Java, jsme si ověřili nabyté zkušenosti z kurzu.

Aktivity
Avatar
Tomáš Hauser:29.4.2020 22:03

Dělám šachy a potřebuju, aby figurka, kterou právě táhnu, byla vykreslená NAD ostatními. Zatím to je tak, že figurky, které přidám jako poslední jsou nad ostatními a ostatní jsou pod nimi. Všechny figurky jsou ve stejné Group.
Kód:

public PieceGUI(Type pieceType, Color color, int x, int y) {
    this.pieceType = pieceType;
    Image piece = null;
    ImageView pieceView;

    move(x, y);
    switch(pieceType) {
        case PAWN:
            if (color == Color.WHITE)
                piece = new Image("/whitePawn.png");
            else
                piece = new Image("/blackPawn.png");
            break;
    }

    pieceView = new ImageView(piece);
    pieceView.setFitHeight(100);
    pieceView.setFitWidth(100);
    pieceView.setX(x * TILE_SIZE);
    pieceView.setY(y * TILE_SIZE);
    getChildren().add(pieceView);


    setOnMousePressed(e -> {
        mouseX = e.getSceneX();
        mouseY = e.getSceneY();
        pieceView.toFront();
    });

    setOnMouseDragged(e -> {
        relocate(e.getSceneX() - mouseX + oldX, e.getSceneY() - mouseY + oldY);
    });
}

Zkusil jsem: Přidat pieceView.toFron­t(); a this.getParen­t().toFront(); a ani jedno nepomohlo. Předpokládám, že změna bude muset proběhnout v setOnMousePressed lambdě.

Chci docílit: Aby se zrovna tahaná figurka dostala v zobrazovací hierarchii nad všechny ostatní.

Editováno 29.4.2020 22:05
 
Odpovědět
29.4.2020 22:03
Avatar
Odpovídá na Tomáš Hauser
Luboš Běhounek Satik:29.4.2020 22:43

Netusim, jak je to resene v javafx, ale budto tu figurku kresli az po tom, co se vykresli ostatni, pokud nad tim mas kontrolu a nebo hledej parametr ZOrder.

Nahoru Odpovědět
29.4.2020 22:43
https://www.facebook.com/peasantsandcastles/
Avatar
Odpovídá na Luboš Běhounek Satik
Tomáš Hauser:29.4.2020 23:12

To bych musel u každého tahu kreslit celou šachovnici znovu, to je k ničemu. Zorder by měl řešit toFront(), ale prostě nefunguje ani mně ani ostatním na Stack Overflow, co to zkoušeli.

 
Nahoru Odpovědět
29.4.2020 23:12
Avatar
Lubor Pešek
Člen
Avatar
Lubor Pešek:30.4.2020 16:32

No, takové ruční řešení by bylo, že v momentě, kdy zaklikneš daný node, tak si vezmeš ObservableLis­t<Node>, na kterém to máš uložené, daný objekt z toho vymažeš a pak ho tam znovu přidáš (tím ho přesuneš na konec seznamu v této kolekci a on se překreslí přes všechny na novo. A jelikož pracuješ s tou samou referencí, tak stále budeš mít nastavené parametry toho objektu).

figurka.setOnMouseClicked(evt -> {
    sachovnice.getChildren().remove(evt.getSource());
    sachovnice.getChildren().add((Node) evt.getSource());
});

Ale uznávám, není to úplně nejčistší :) Netuším, jestli ObservableList nemá metodu, která by dokázala přehodit pořadí v tomto seznamu. Každopádně je to zobrazováno jako bucket, takže ten první se zobrazí jako první a následující ho překreslí....

Minimálně ti to bude fungovat, ale zkus pohledat optimálnější řešení.

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
30.4.2020 16:32
Existují dva způsoby, jak vyřešit problém. Za prvé vyhoďte počítač z okna. Za druhé vyhoďte okna z počítače.
Avatar
Odpovídá na Lubor Pešek
Tomáš Hauser:2.5.2020 17:49

Jak to, že mě to nenapadlo. Jasně, že to funguje - GUI je úplně oddělené od virtuální šachovnice. Děkuji, pane. :-) :-)

 
Nahoru Odpovědět
2.5.2020 17:49
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 5 zpráv z 5.