javafx-8 - JavaFX 8 - GridPane 自动调整大小问题

标签 javafx-8 gridpane

设置某些特定跨度配置时,GridPane 自动调整大小存在问题。

以下配置按我的预期工作:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class GridPaneWidthIssue extends Application {

    public static void main(String... arguments) {
        launch(arguments);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        GridPane gridPane = new GridPane();

        BorderStroke borderStroke = new BorderStroke(Color.RED,
                BorderStrokeStyle.SOLID, CornerRadii.EMPTY,
                BorderWidths.DEFAULT);

        Border border = new Border(borderStroke);
        gridPane.setBorder(border);
        gridPane.setGridLinesVisible(true);
        gridPane.setHgap(2);
        gridPane.setVgap(2);
        gridPane.setPadding(new Insets(10));

        Label column0 = new Label("Column 0");
        Label column1 = new Label("Column 1");
        Label column2 = new Label("Column 2");
        Label column01 = new Label("Span column 0 and 1");
        Label column012 = new Label("Span column 0, 1 and 2");

        gridPane.add(column0, 0, 0);
        gridPane.add(column1, 1, 0);
        gridPane.add(column2, 2, 0);
        gridPane.add(column01, 0, 1, 2, 1);
        gridPane.add(column012, 0, 2, 3, 1);

        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

我还无法发布图像来证明这一点,但我可以验证以下断言:

**gridpane.width = 列0.宽度 + 列1.宽度 + 列2.宽度

当我删除第 0 行中的标签时,我得到以下代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.Border;
import javafx.scene.layout.BorderStroke;
import javafx.scene.layout.BorderStrokeStyle;
import javafx.scene.layout.BorderWidths;
import javafx.scene.layout.CornerRadii;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

public class GridPaneWidthIssue extends Application {

    public static void main(String... arguments) {
        launch(arguments);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        GridPane gridPane = new GridPane();

        BorderStroke borderStroke = new BorderStroke(Color.RED,
                BorderStrokeStyle.SOLID, CornerRadii.EMPTY,
                BorderWidths.DEFAULT);

        Border border = new Border(borderStroke);
        gridPane.setBorder(border);
        gridPane.setGridLinesVisible(true);
        gridPane.setHgap(2);
        gridPane.setVgap(2);
        gridPane.setPadding(new Insets(10));

        Label column0 = new Label("Column 0");
        Label column1 = new Label("Column 1");
        Label column2 = new Label("Column 2");
        Label column01 = new Label("Span column 0 and 1");
        Label column012 = new Label("Span column 0, 1 and 2");

        // gridPane.add(column0, 0, 0);
        // gridPane.add(column1, 1, 0);
        // gridPane.add(column2, 2, 0);
        gridPane.add(column01, 0, 1, 2, 1);
        gridPane.add(column012, 0, 2, 3, 1);

        Scene scene = new Scene(gridPane);
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

结果不正确:

gridpane.width >栏0.宽度+栏1.宽度+栏2.宽度

我没有验证,但我猜是:

gridpane.width=column0.width+column1.width+column0.width+column1.width+column2.width

JavaFX 问题还是我误解了 Gridpane 大小调整策略?

情况1:好的

enter image description here

情况 2:KO(GridPane 中的空白区域)

enter image description here

最佳答案

您会看到 GridPane 右侧有多余的空间,因为添加 column012 标签时的 colspan 为 3,添加 column01 时的 colspan 为 2标签(并且您不再有三列,而是只有一列)。请记住,GridPane 是一个表,您需要保持其列平衡并使其跨度在其列/行限制内。在您的情况下,空白区域只是 GridPane 内任何标签无法触及的第三列。

更改此:

gridPane.add(column012, 0, 2, 3, 1);

对此:

gridPane.add(column012, 0, 2, 2, 1);

你会看到

Image without extra columns

理想情况下,如果您计划只有一列,您应该删除该 colspan 和 rowspan 并保留此内容:

gridPane.add(column01, 0, 1);
gridPane.add(column012, 0, 2);

如果保持列平衡,则 GridPane 的宽度将是可预测的,因为它将计算为:插入 + 间隙 + 每列宽度

您可能还想查看 ColumnConstraints类来根据您的喜好自定义每个列的行为。

希望这有帮助!

关于javafx-8 - JavaFX 8 - GridPane 自动调整大小问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28348688/

相关文章:

java - GridPane getRowIndex 在第二次使用后返回 null

java - 到达场景末尾时如何防止 FlowPane 换行(垂直)

java - 可以决定 GridPane (JavaFX) 中的行数和列数

JavaFX - 边框半径<->背景颜色

java - 如何从下往上添加网格中的对象?

javafx gridpane 居中对齐并对齐所有标签

java - 为什么向 BorderPane 添加另一个元素会弄乱我的格式?

java - 在 javafx 中保存最后一个窗口属性/内容

java - 在Javafx中更新或删除后如何刷新数据库 TableView ?

JavaFX 更改不同类的 Pane 颜色