3

特定のスパン構成を設定する場合、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 = column0.width + column1.width + column2.width

行 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 > column0.width + column1.width + column2.width

私はそれを確認しませんでしたが、それは次のとおりだと思います:

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

JavaFX の問題ですか、それとも Gridpane のサイズ設定ポリシーを誤解していますか?

ケース 1: OK

ここに画像の説明を入力

ケース 2: KO (GridPane の空きスペース)

ここに画像の説明を入力

4

1 に答える 1

0

column012Label を追加するときは colspan が 3であり、Label を追加するときは colspan が 2 であるため、GridPane の右側に余分なスペースが表示されますcolumn01(3 つの列ではなく 1 つしかありません)。GridPane はテーブルであり、列のバランスを保ち、列/行の制限内に収まるようにする必要があることに注意してください。あなたの場合、空のスペースは、GridPane 内のラベルの範囲を超えた 3 番目の列です。

これを変える:

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

これに:

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

そして、あなたは見るでしょう

余分な列がない画像

理想的には、1 つの列のみを計画している場合は、その colspan と rowspan を削除して、これをそのままにしておく必要があります。

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

列のバランスを保つ場合、GridPane の幅はインセット + ギャップ + 各列幅として計算されるため、予測可能になります。

また、 ColumnConstraintsクラスを調べて、各列の動作を好みに合わせてカスタマイズすることもできます。

お役に立てれば!

于 2015-08-19T20:53:37.557 に答える