Layout 我可以强制JavaFX';是否使用网格窗格均匀分布空间?

Layout 我可以强制JavaFX';是否使用网格窗格均匀分布空间?,layout,javafx-2,gridpanel,Layout,Javafx 2,Gridpanel,在JavaFX2中使用GirdPanes时,我遇到了一些奇怪的布局行为。虽然它通常似乎在多个字段之间均匀地分布水平空间,但在其他一些情况下却不这样做。下面是一个显示效果的示例: import javafx.application.Application; import javafx.geometry.Insets; import javafx.scene.Scene; import javafx.scene.control.Control; import javafx.scene.control

在JavaFX2中使用GirdPanes时,我遇到了一些奇怪的布局行为。虽然它通常似乎在多个字段之间均匀地分布水平空间,但在其他一些情况下却不这样做。下面是一个显示效果的示例:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Control;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;

public class TestDialog extends Stage {
    public TestDialog() {
        super();
        setTitle("Test");

        GridPane grid = new GridPane();
        grid.setHgap(5);
        grid.setVgap(5);
        grid.setPadding(new Insets(10, 10, 10, 10));

        final TextField tField1 = new TextField();
        final TextField tField2 = new TextField();
        tField2.setMaxWidth(200);

        grid.add(createLabel("Field 1:"), 0, 0);
        grid.add(tField1, 1, 0);
        grid.add(createLabel("Field 2:"), 2, 0);
        grid.add(tField2, 3, 0);

        Pane pane = new Pane();
//        pane.setMinSize(600, 100);  // first row has weird layout behaviour
        pane.setMinSize(100, 100); // first row is fine
        pane.setStyle("-fx-background-color: black");
        grid.add(pane, 0, 1, 4, 1);

        grid.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);

        setScene(new Scene(grid));
    }

    private Label createLabel(String text) {
        Label label = new Label(text);
        label.setMinSize(Control.USE_PREF_SIZE, Control.USE_PREF_SIZE);
        return label;
    }

    public static void main(String[] args) {
        TestApplication.main(args);
    }

    public static class TestApplication extends Application {
        @Override
        public void start(Stage stage) throws Exception {
            TestDialog dialog = new TestDialog();
            dialog.showAndWait();
        }

        public static void main(String[] args) {
            launch(args);
        }
    }
}
在本例中,如果按原样运行,对话框将很好地调整大小。如果将额外窗格的最小大小更改为注释中的版本,则会出现问题:第一行中的额外空间将变为空白(而不是增加第一个字段),减小对话框大小会将其从已经很小的第一个字段中移除,空区保持不变

有没有办法让GridPane实际使用第一个字段的可用水平空间?我知道,将对话框大小减小到所需的最小值以下并不一定会产生好的结果,但不首先扩展字段对我来说显然是错误的


我从JDK1.7.0_21开始使用JavaFX。

您必须查看ColumnConstraints和RowConstraints类。这些将告诉网格窗格如何分配空间。不幸的是,API在这里有点笨拙。如果要均匀分布未知数量的空间,必须首先实例化约束,然后使用#setPercentageWidth-此选项在构造函数中不可用

总而言之,具有3个均匀分布列的GridPane(如果可能,同时考虑最小大小)将如下所示:

public class Test extends Application {
    public void start(final Stage stage) throws Exception {
        final GridPane grid = new GridPane();
        grid.getColumnConstraints().setAll(
                ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(),
                ColumnConstraintsBuilder.create().percentWidth(100/3.0).build(),
                ColumnConstraintsBuilder.create().percentWidth(100/3.0).build()
        );
        grid.add(new Button("One"),0,0);
        grid.add(new Button("Two"),1,0);
        grid.add(new Button("and three"),2,0);

        stage.setScene(new Scene(grid));
        stage.show();
    }

    public static void main(String[] args) {
        Application.launch(args);
    }
}

您可以相应地处理行约束。您可能还希望在单元格中设置对齐方式,以确保对话框在调整大小时仍保持良好的外观

我知道这些限制,但到目前为止,我的实验都产生了有趣但不是很有用的结果。在最小尺寸的情况下,宽度的计算似乎完全被打破了——如果所有列的宽度都设置为25%,窗口就会变得很大。我现在已经转到MiG布局。
ColumnStraintsBuilder
不推荐使用。请参见
列约束