【问题标题】:JavaFx: How to make a cube adjust to window resizeJavaFx:如何使多维数据集调整以调整窗口大小
【发布时间】:2014-11-30 05:50:10
【问题描述】:

我在进行 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();
}

矩形立方体显示为这样,但我不知道如何在调整窗口大小时使其扩展或收缩:

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

【问题讨论】:

    标签: java oop javafx drawing shapes


    【解决方案1】:

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

    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);
    

    【讨论】:

      【解决方案2】:

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

      基本上,您创建自定义窗格并覆盖“layoutChildren()”方法来绘制立方体。你“只是”必须用你的立方体替换绘图代码。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-24
        • 2014-07-04
        • 2020-06-07
        • 1970-01-01
        • 2015-06-01
        • 1970-01-01
        • 2017-03-25
        相关资源
        最近更新 更多