JavaFx:如何使多维数据集适应窗口大小调整

时间:2014-11-30 05:50:11

标签: java oop javafx drawing shapes

我正在进行javafx练习。基本上问题是制作一个矩形立方体并使其在调整窗口大小时自动扩展或收缩。我完成了程序部分的第一部分,但第二部分遇到了困难。这是我的代码:

public void start(Stage primaryStage) {
    Pane pane = new Pane();

    //Draw two rectangles
    Rectangle upper = new Rectangle(140, 100, 120, 100);
    upper.setFill(null);
    upper.setStroke(Color.BLACK);
    Rectangle lower = new Rectangle(100, 140, 120, 100);
    lower.setFill(null);
    lower.setStroke(Color.BLACK);

    //Draw the line connecting them
    Line ul = new Line(140, 100, 100, 140);
    Line ur = new Line(260, 100, 220, 140);
    Line ll = new Line(140, 200, 100, 240);
    Line lr = new Line(260, 200, 220, 240);

    pane.getChildren().addAll(upper, lower, ul, ur, ll, lr);

    Scene scene = new Scene(pane, 200, 200);

    primaryStage.setTitle("Exercise14");
    primaryStage.setScene(scene);
    primaryStage.show();
}

矩形立方体就像这样出现,但是当我调整窗口大小时,我无法弄清楚如何使它展开或收缩:

cube is drawn

cube does not resize properly

我想我需要将每个单独的形状绑定到窗格或其他东西,但我不知道从哪里开始。会欣赏正确方向的一点。感谢。

2 个答案:

答案 0 :(得分:0)

您需要向场景添加更改侦听器,并计算立方体相对于场景宽度和高度的尺寸。像这样:

ChangeListener<Number> listenerX = new ChangeListener<Number>() {

    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

        System.out.println( "X: observable: " + observable + ", oldValue: " + oldValue.doubleValue() + ", newValue: " + newValue.doubleValue());

        // TODO:
        // Lines:
        //   line.setStartX(...)
        //   line.setStartY(...)
        //   line.setEndX(...)
        //   line.setEndY(...)
        // 
        // Rectangles:
        //   rect.setTranslateX(...)
        //   rect.setTranslateY(...)
        //   rect.setWidth(...)
        //   rect.setHeight(...)
        // hint: instead of translate you can use rect.relocate(..., ...). translate is relative, relocate applies layoutX/Y and translateX/Y

    }
};

ChangeListener<Number> listenerY = new ChangeListener<Number>() {

    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

        System.out.println( "Y: observable: " + observable + ", oldValue: " + oldValue.doubleValue() + ", newValue: " + newValue.doubleValue());

        // similare to listenerX

    }
};

scene.widthProperty().addListener( listenerX);
scene.heightProperty().addListener( listenerY);

答案 1 :(得分:0)

我会推荐这里解释的方法:http://fxexperience.com/2014/05/resizable-grid-using-canvas/

基本上,您可以创建自定义窗格并覆盖'layoutChildren()'方法来绘制多维数据集。您“只需”用您的多维数据集替换绘图代码。

这比使用侦听器方法要快得多:当调整节点大小时,在使用侦听器时(设置宽度和高度时),它将至少绘制两次。 'layoutChildren()'每帧最多只能进行一次抽奖。