如何通过调整组件大小来绑定舞台大小调整?

Aga*_*ria 16 javafx javafx-2 fxml

我有一个带FXML的JavaFX 2.0应用程序.我希望在调整带有应用程序的窗口时调整组件(TextFields,ComboBoxes,layouts等)的大小.所以...

使用JavaFX构建GUI应用程序时,您会注意到API中的某些类已经实现了属性.例如,javafx.scene.shape.Rectangle类包含的属性arcHeight,arcWidth,height,width,x,和y.对于这些属性中的每一个,将存在与先前描述的约定匹配的对应方法.例如getArcHeight(),setArcHeight(double),arcHeightProperty(),它们共同表明(对开发人员和工具)给定的属性存在.*

  • 要将监听器添加到舞台,我必须执行以下操作:

       stage.resizableProperty().addListener(new ChangeListener<Boolean>(){
        @Override
        public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){
            throw new UnsupportedOperationException("Not supported yet.");
        }
    
    });
    
    Run Code Online (Sandbox Code Playgroud)

所以有两个问题:

  • 要进行一些绑定,我必须在控制器类中获得我的舞台.那么 - 我怎样才能在控制器类中获得一个阶段?
  • 它看起来像UI控件没有任何width\height属性,绑定到某些东西.或许我还没找到它们.

那么,我该如何解决我的问题呢?

UPD.关于Scene Builder到Sergey Grinev:当我在我的组件上使用 Ctrl + K(告诉它占据其父组件的整个区域)时 - 一切正常.

但是如果我想告诉我的组件占据50%的面积呢?例如,我有一个带有两个VBox的标签.标签的宽度为100px.Vbox的宽度分别为50px.VBox1的x1 = 0,x2 = 50,VBox2的x1 = 50,x2 = 100.然后我用JavaFX应用程序调整窗口大小.现在我有tab的Width = 200px.但是我的VBoxes宽度仍然是= 50px:VBox1有x1 = 0,x2 = 50,VBox2有x1 = 150,x2 = 200.我需要它们是VBox1 x1 = 0x2 = 100而VBox2 x1 = 100x2 = 200.其中x1和x2值是VBoxes角的坐标.

在这种情况下,Scene Builder如何帮助我?

jew*_*sea 20

关于构建可调整大小的guis =>的一些建议

  • 确保应用的根目录是Pane子类,而不是Group.
  • 取消释放按钮的最大大小(例如button.setMaxSize(Double.MAX_VALUE,Double.MAX_VALUE).
  • 大多数情况下,布局窗格可以为您处理调整大小,并且您不需要绑定和侦听器=>即只在您真正需要时绑定.
  • UI控件和布局窗格是Regions =>所有区域都具有只能读取和绑定的高度和宽度属性.
  • 您不能直接将控件的高度和宽度属性绑定到另一个值.而是使用minWidth/Height,prefWidth/Height,maxWidth/Height属性.
  • 如果需要,场景具有可以绑定的高度和宽度属性.如果执行此操作,则在调整舞台大小时,将调整场景大小,然后调整绑定的组件的大小.如果场景的根是布局窗格而不是组,则通常不需要此绑定.
  • 如果没有在场景上设置高度和宽度,对于独立应用程序,场景(和舞台)的大小将适合场景根节点的首选大小(通常是您想要的).
  • 如果所有其他方法都失败了,您可以重新启动Parent的layoutchildren方法.

以下是可调整大小的JavaFX UI 的示例,该UI实现了上述一些原则.


Ser*_*nev 7

另一个简单的选择是使用JavaFX Scene Builder(最近成为公共测试版:http://www.oracle.com/technetwork/java/javafx/tools/index.html)

它允许通过拖放创建UI并将UI元素锚定到边框(通过锚点工具),因此它们可以使用窗口边框移动/调整大小.

更新:

为了实现自动尺寸比例布局,可以使用GridPane具有ColumnConstraint:

public void start(Stage stage) {

    VBox box1 = new VBox(1);
    VBox box2 = new VBox(1);

    //random content
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20);
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build());
    builder.fill(Color.RED);
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build());

    //half by half screen
    GridPane grid = new GridPane();
    grid.addRow(0, box1, box2);

    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build();
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint);

    stage.setScene(new Scene(grid, 300, 250));
    stage.show();
}
Run Code Online (Sandbox Code Playgroud)