首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >BorderPane中的JavaFX-8画布

BorderPane中的JavaFX-8画布
EN

Stack Overflow用户
提问于 2014-01-07 09:42:18
回答 1查看 3.6K关注 0票数 4

我对整个JavaFX很陌生,正如你可能知道的那样。这是我最近在玩画布节点时遇到的一个问题。我有一个BorderPane作为我的根节点,我想让一个画布占据它中心的所有可用空间。然而,我在实现这种行为时遇到了一些困难。以下是我一直在尝试的:

代码语言:javascript
复制
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();
}

我的画布没有像窗格那样展开,而是保持在它的中心位置,保持原来的尺寸。如果重新添加顶部附近的两条注释线,画布就会像窗格那样增长和缩小,但不考虑其中心的尺寸(如预期的那样)。是否有一种方法可以将这种绑定行为应用于BorderPane的中心,或者是另一种完全实现我不知道的方法?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-01-07 22:46:39

编辑:刚刚找到了一个更好的解决方案(19.05.2014):

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

比我的更简单更短-

现在是我最初的方法

我和你有同样的问题。

我找到了一个非常难看的解决方案--你可以使用,但是也许还有另一种方法.

我的解决办法:

代码语言:javascript
复制
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();
    }
}

在你的主旋律中:

代码语言:javascript
复制
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();
    }
}

希望这能帮你解决问题。

nZeloT

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20968318

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档