Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Homo
Člen
Avatar
Odpovídá na David Čápka
Homo:

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

Nahoru Odpovědět 17.8.2013 11:18
1010011 1000101 1011000
Avatar
David Čápka
Tým ITnetwork
Avatar
Odpovídá na Homo
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
Homo
Člen
Avatar
Odpovídá na David Čápka
Homo:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na Homo
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
David Čápka
Tým ITnetwork
Avatar
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
goddard
Člen
Avatar
goddard:

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 Čápka
Tým ITnetwork
Avatar
Odpovídá na goddard
David Čápka:

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
Miluji svou práci a zdejší komunitu, baví mě se rozvíjet, děkuji každému členovi za to, že zde působí.
Avatar
goddard
Člen
Avatar
goddard:

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.