JavaFX-8 Toile dans BorderPane


Je suis assez nouveau dans toute cette chose JavaFX, comme vous pouvez probablement le dire. C'est un problème que j'ai rencontré récemment en jouant avec le nœud Canvas. J'ai un BorderPane comme nœud racine, et j'aimerais qu'un Canevas occupe tout l'espace disponible au centre de celui-ci. Cependant, j'ai du mal à implémenter ce comportement exact. Voici le juste de ce que j'ai essayé:

public void start(Stage stage){
    BorderPane root=new BorderPane();
    Canvas canvas=new Canvas(250,250);
    //canvas.widthProperty().bind(root.widthProperty());
    //canvas.heightProperty().bind(root.heightProperty());
    GraphicsContext gc=canvas.getGraphicsContext2D();
    new AnimationTimer(){
        @Override
        public void handle(long l){
            double width=canvas.getWidth(),height=canvas.getHeight();
            gc.clearRect(0,0,width,height);
            gc.strokeRect(0,0,width,height);
            gc.strokeLine(0,0,width,height);
            gc.strokeLine(0,height,width,0);
        }
    }.start();
    root.setCenter(canvas);
    root.setBottom(new Button("Placeholder"));
    root.setTop(new Button("Placeholder"));
    stage.setScene(new Scene(root));
    stage.show();
}

Au lieu de s'étendre comme le fait le volet, ma toile reste centrée à l'intérieur, en conservant sa taille d'origine. Si les deux lignes commentées près du haut sont rajoutées, le Canevas grandit et se rétrécit comme le fait le Volet, mais sans tenir compte des dimensions de son centre (comme prévu). Existe-t-il un moyen d'appliquer ce type de comportement contraignant au centre du BorderPane, ou peut-être une autre façon de le faire entièrement dont je ne suis pas au courant?

Author: Ryan Hilbert, 2014-01-07

1 answers

EDIT: je Viens de trouver un beaucoup plus agréable la solution aujourd'hui (19.05.2014):

Http://fxexperience.com/2014/05/resizable-grid-using-canvas/

Tellement plus facile et plus court que le mien -.-


Maintenant, mon approche originale:

J'ai eu le même problème que vous.

J'ai trouvé un solution de contournement vraiment laide que vous pouvez utiliser, mais il existe peut-être une autre méthode pour le faire...

Ma solution de contournement:

class MyCanvas {

    private Canvas cv;
    private StackPane box;

    public MyCanvas(Stage stg) {
        cv = new Canvas(500, 500);
        box = new StackPane();

        box.getChildren().add(cv);

        //When the Stage size changes, the canvas size becomes resetted
        //but the Hbox expandes automatically to fit the with again
        //and so the canvas become resized to fit the HBox
        stg.widthProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
             resize();
            }
        });

        stg.heightProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
            resize();
            }
        }); 

        box.widthProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
            adapt();
            }
        });

        box.heightProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> arg0, Number arg1, Number arg2) {
            adapt();
            }
        });

        paint();
    }

    private void paint(){
        //Paint something ....
        GraphicsContext ctx = cv.getGraphicsContext2D();

        double w = cv.getWidth();
        double h = cv.getHeight();

        ctx.clearRect(0, 0, w, h);

        ctx.setFill(Color.BLUE);
        ctx.fillRect(0, 0, w, h);
    }

    //Add this HBox to your content pane
    public StackPane getBox() {
        return box;
    }

    public void resize(){
        cv.setWidth(50);
        cv.setHeight(50);
    }

    private void adapt(){
        cv.setHeight(box.getHeight());
        cv.setWidth(box.getWidth());
        paint();
    }
}

Et dans votre principal:

public class Root extends Application{
    public static void main(String[] args){ launch(args); }

    public void start(Stage stg){
        MyCanvas cv = new MyCanvas(stg);
        BorderPane pane = new BorderPane();
        pane.setCenter(pane.getBox());
        stg.setScene(new Scene(pane));
        stg.show();
    }
}

J'espère que cela vous aidera à résoudre votre problème.

NZeloT

 1
Author: nZeloT, 2014-05-19 18:37:32