6

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 を使用しています。

4

1 に答える 1