如何使TextField填充包含多个节点的窗格的所有剩余宽度?

时间:2019-06-22 16:34:49

标签: java javafx

我需要为我的任务创建一个模拟聊天的JavaFX应用程序(没有网络功能,只有两个文本字段用于输入,两个文本区域用于输出)。我的文本字段旁边需要有一个“发送”按钮。我无法在启动时不“挤压”按钮的情况下使文本字段填满窗口的宽度,这与swing的bo​​xLayout一样?

我将字段的宽度绑定到父窗格的宽度,减去按钮的宽度和窗格的间距,在我开始调整窗口大小后它可以工作,但是当应用程序第一次启动时,按钮的文本并不完全可见。 / p>

public void start(Stage stage_main) throws Exception {
        //Pane creation and nesting:
        HBox pane_main = new HBox();
        Scene scene_main = new Scene(pane_main, 480, 360);
        BorderPane pane_left_parent = new BorderPane();
        BorderPane pane_right_parent = new BorderPane();
        HBox pane_left_bottom = new HBox();
        HBox pane_right_bottom = new HBox();
        pane_main.getChildren().addAll(pane_left_parent, pane_right_parent); //Focusing only on the left pane for now for testing.
        pane_left_parent.setBottom(pane_left_bottom);

        //Contents creation and nesting:
        TextArea textA_left = new TextArea("Testing...");
        Button button_left = new Button("Send");
        TextField textF_left = new TextField("Test input...");
        textF_left.prefWidthProperty().bind(pane_left_bottom.widthProperty().subtract(button_left.widthProperty()).subtract(pane_left_bottom.spacingProperty()));

        //Placing contents in panes:
        pane_left_parent.setCenter(textA_left);
        pane_left_bottom.setSpacing(3);
        pane_left_bottom.getChildren().addAll(textF_left, button_left);

        //Finishing up:
        stage_main.setScene(scene_main);
        stage_main.show();
    }

是否有任何方法可以使按钮在启动时就具有“最佳”大小,而无需像挥杆一样手动设置任何像素宽度?

1 个答案:

答案 0 :(得分:1)

请勿将prefWidth绑定到父级。如果您希望HBox的孩子水平生长,可以在其上设置hgrow约束:

HBox.setHgrow(theChild, Priority.ALWAYS);

然后让HBox处理子节点的大小和位置。正如您所指出的,为了阻止Button随尺寸变化而缩小,您需要设置其HBox。但是,您应该使用:

minWidth

如果您使用button.setMinWidth(Region.USE_PREF_SIZE); ,则可能会在getWidth()实际上具有非零宽度之前意外地调用它。另外,使用Button意味着USE_PREF_SIZE将保持与minWidth的最新状态(如果您出于任何原因进行了更改)。


一些链接: