我可以强制JavaFX的GridPane均匀分配空间吗?

时间:2013-05-01 01:10:51

标签: layout javafx-2 gridpanel

在JavaFX 2中使用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实际使用第一个字段的可用水平空间?我知道将对话框大小减小到所需的最低限度并不一定会产生好的结果,但是首先不扩展该领域对我来说似乎是完全错误的。

我从JDK 1.7.0_21开始使用JavaFX。

1 个答案:

答案 0 :(得分:1)

您必须查看ColumnConstraints和RowConstraints类。这些将告诉GridPane如何分配空间。不幸的是,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);
    }
}

您可以相应地处理RowConstraints。您可能还需要在单元格中设置对齐方式,以确保在调整对话框时对话框仍然看起来很好。