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í.
Mezi 13:00 až cca 16:00 proběhne odstávka sítě z důvodu aktualizace. Web bude po celou dobu nedostupný.

Diskuze: JavaFX canvas

Aktivity
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:17.8.2013 11:07

Ahoj kluci, učím se JavaFX a nějak se mi nedaří udělat jednoduchou aplikaci, kde bych si něco vykreslil na Canvas. Podle tutoriálu od Oracle to funguje krásně, jenže já chci GUIčko dělat přes FXML a tam se mi to nedaří rozchodit.

Funguje mi toto:

Group root = new Group();
Canvas canvas = new Canvas(300, 250);
GraphicsContext gc = canvas.getGraphicsContext2D();
drawShapes(gc);
root.getChildren().add(canvas);

Jenže když udělám to samé pro FXML aplikaci:

Parent root = FXMLLoader.load(getClass().getResource("Sample.fxml"));
Canvas canvas = new Canvas(300, 250);
GraphicsContext gc = canvas.getGraphicsContext2D();
drawShapes(gc);
root.getChildren().add(canvas);

Dostávám chybu, že getChildren() je protected. V FXML Scene Builderu jsem Canvas nikde nenašel.

Odpovědět
17.8.2013 11:07
New kid back on the block with a R.I.P
Avatar
Homo
Člen
Avatar
Odpovídá na David Hartinger
Homo:17.8.2013 11:18

Canvas musis rucne pridat v kontroleru na nejakej pane/box.

Nahoru Odpovědět
17.8.2013 11:18
1010011 1000101 1011000
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Homo
David Hartinger:17.8.2013 11:24

No mně jde právě o to přidání, scrollPane.get­Children().ad­d(canvas) nefunguje.

Nahoru Odpovědět
17.8.2013 11:24
New kid back on the block with a R.I.P
Avatar
Homo
Člen
Avatar
Odpovídá na David Hartinger
Homo:17.8.2013 11:41

A pridavas to v kontroleru pres JavaFX vlakno pomoci tridy Platform?

Nahoru Odpovědět
17.8.2013 11:41
1010011 1000101 1011000
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na Homo
David Hartinger:17.8.2013 12:18

Podařilo se mi to přidat do VBoxu, do ScrollPane to prostě nejde, což opravdu nechápu. Jak to přidávám jsem tu psal už 2x.

Nahoru Odpovědět
17.8.2013 12:18
New kid back on the block with a R.I.P
Avatar
David Hartinger
Vlastník
Avatar
David Hartinger:17.8.2013 12:20

Stejně mi ta JavaFX přijde nedovařená a to je to už 2. verze, není tam ani MessageBox, což mě dost zaráží.

Nahoru Odpovědět
17.8.2013 12:20
New kid back on the block with a R.I.P
Avatar
goddard
Člen
Avatar
goddard:18.8.2013 4:17

Canvas je hlavne urceny na neco jineho nez delani GUI pres FXML. Je to plocha urcena k vykreslovani setjne jako v HTML5 s trochu jinymi zakonitostmi. Cili to Canvas API nepouzivas ve spravnem kontextu (to bude tim ze prechazis ze Swingu?)
Pokud potrebujes v JavaFX kreslit at uz "controls" nebo graficky primitiva, tak nepotrebujes Canvas. Pro graficky primitiva se pouziva Group a pro controls jsou layout manazery.
MessageBox se da udelat pres Scene nebo Stage (nevim, za celou dobu jsem to nepotreboval ale jde to).

 
Nahoru Odpovědět
18.8.2013 4:17
Avatar
David Hartinger
Vlastník
Avatar
Odpovídá na goddard
David Hartinger:18.8.2013 7:59

Jenže já dělám level editor a potřebuji jak klasická tlačítka, tak canvas ve ScrollPane, do kterého se kreslí výsledný level ;-) Že jsi nikdy nepotřeboval MessageBox je zvláštní, používám na něj knihovnu třetí strany, ale je ostuda, že to tam nemají.

Nahoru Odpovědět
18.8.2013 7:59
New kid back on the block with a R.I.P
Avatar
goddard
Člen
Avatar
goddard:20.8.2013 14:53

To je spis otazka toho jak a jake tam nacpat layout manazery nez o pouziti Canvas API. Tlacitka muzes nacpat do GridPane, a na samotnou mapu se ti hodi TilePane, pripadne StackPane (do nej muzes nacpat kolik vrstev chces a pak je prochazet napriklad pomoci udalosti mysi - kliknutim nebo koleckem).
Podivej se na tohle video:
http://www.youtube.com/watch?…

Vsimni si ze tam mam v pohode kombinaci "controls" i grafickych primitiv bez pouziti Canvas API.
Tady je kod:

public class HoverBar extends FlowPane {

    public HoverBar() {
        super();
        this.setStyle("-fx-background-color: gray;");
        this.setPickOnBounds(true);
        this.setOpacity(0);
        setOnMouseEntered (new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent meEntered) {
                if (isHover()) {
                    setOpacity(1);
                }
            }
        });

        setOnMouseExited(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent meExited) {
                if (!isHover()) {
                    setOpacity(0);
                }
            }
        });
    }
}

Je to docela obycejna podtrida FlowPane do ktere muzes nacpat jakykoliv GUI prvek nebo graficky primitiva prave diky tomu ze v JavaFX snad vsechno co vidis dedi od Node. Ten HoverBar je pak nacpany do Group ktera je korenem grafu sceny v tom demu.

 
Nahoru Odpovědět
20.8.2013 14:53
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 9 zpráv z 9.