JavaFX布局对齐,相当于GridBagLayout

pet*_*on1 2 java user-interface javafx

我想知道是否有人对JavaFX 8有很多经验.我正在做一些表格布局并且需要对齐它们(我是用这个东西强调OCD).我知道在Swing中我可以使用GridBagLayout,但是这不再适用了,我可以设置权重而不是,但我不认为我可以用GridPane做到这一点,JavaFX中有没有相同的东西?

我无法发布图片,因此我将其链接到目前的样子,并突出显示了一些不是我想要的区域.

https://gyazo.com/c112ab623ffd66e6f723eb9be1fcaea9

该代码之前也可用

    public class ControlsPanel extends GridPane {
    private TextField[] buttons;
    private TextField[] miscTextFields;

    private Label[] labels;

    private Button startSimBtn;

    private TabPane tabPane;
    private Tab cooperatorTab, defectorTab;
    private final int PADDING = 5;
    private final String[] v = 
        {
            "C_A_N", "C_A_PD", 
            "C_A_PN", "C_N_N", 
            "C_N_PD", "C_N_PN", 
            "D_A_N", "D_A_PD",
            "D_A_PN", "D_N_N",
            "D_N_PD", "D_N_PN"
        };
    private final String[] miscTfLabelValues = 
    {
            "Apology cost: ", "Noise level: ", "Punishmment Cost: ", "Punished Cost: "
    };

    public ControlsPanel() 
    {
        buttons = new TextField[12];
        labels = new Label[buttons.length];
        miscTextFields = new TextField[miscTfLabelValues.length];

        for(int k = 0; k < miscTfLabelValues.length; k++) 
        {
            miscTextFields[k] = new TextField();
        }

        for(int j = 0; j < buttons.length; j++) 
        {
            buttons[j] = new TextField();
        }

        for(int i = 0; i < v.length; i++)
        {
            labels[i] = new Label(v[i]);
        }

        tabPane = new TabPane();
        startSimBtn = new Button("Start");

        cooperatorTab = new Tab("Cooperator");
        defectorTab = new Tab("Defector");

        layoutComponents();
    }

    private void layoutComponents() 
    {
        setAlignment(Pos.TOP_LEFT);

        cooperatorTab.setContent(layoutCooperatorTab());
        cooperatorTab.setClosable(false);
        defectorTab.setContent(layoutDefectorTab());
        defectorTab.setClosable(false);

        tabPane.getTabs().addAll(cooperatorTab, defectorTab);

        getColumnConstraints().add(new ColumnConstraints(Values.SCREEN_WIDTH));

        add(tabPane, 0, 0);

        add(layoutMiscPane(), 0, 1);
    }

    private GridPane layoutMiscPane() 
    {
        GridPane pane = new GridPane();

        pane.setAlignment(Pos.TOP_LEFT);
        pane.setHgap(10);
        pane.setVgap(10);
        pane.setPadding(new Insets(PADDING,PADDING,PADDING, 15));


        pane.setPadding(new Insets(0, 75, 15, 15));
        pane.add(new Label(miscTfLabelValues[0]), 0, 1);

        pane.add(miscTextFields[0], 1, 1);

        pane.setPadding(new Insets(0, -100, 0, 0));
        pane.add(new Label(miscTfLabelValues[1]), 0, 2);

        pane.add(miscTextFields[1], 1, 2);

        //
        pane.add(new Label(miscTfLabelValues[2]), 0, 3);

        pane.add(miscTextFields[2], 1, 3);

        //
        pane.add(new Label(miscTfLabelValues[3]), 0, 4);

        pane.add(miscTextFields[3], 1, 4);

        return pane;

    }
    private GridPane layoutCooperatorTab()
    {

        GridPane pane = new GridPane();

        pane.setAlignment(Pos.TOP_LEFT);
        pane.setHgap(10);
        pane.setVgap(10);
        pane.setPadding(new Insets(PADDING,PADDING,PADDING, 15));

        pane.add(labels[0], 0, 1);

        pane.add(buttons[0], 1, 1);

        pane.add(labels[1], 0, 2);

        pane.add(buttons[1], 1, 2);

        //
        pane.add(labels[2], 0, 3);

        pane.add(buttons[2], 1, 3);

        //
        pane.add(labels[3], 0, 4);

        pane.add(buttons[3], 1, 4);


        //
        pane.add(labels[4], 0, 5);

        pane.add(buttons[4], 1, 5);

        //
        pane.add(labels[5], 0, 6);

        pane.add(buttons[5], 1, 6);

        return pane;
    }
    private GridPane layoutDefectorTab() 
    {
        GridPane pane = new GridPane();

        pane.setAlignment(Pos.TOP_LEFT);
        pane.setHgap(10);
        pane.setVgap(10);
        pane.setPadding(new Insets(PADDING,PADDING,PADDING,15));

        pane.add(labels[6], 0, 1);

        pane.add(buttons[6], 1, 1);

        pane.add(labels[7], 0, 2);

        pane.add(buttons[7], 1, 2);

        //
        pane.add(labels[8], 0, 3);

        pane.add(buttons[8], 1, 3);

        //
        pane.add(labels[9], 0, 4);

        pane.add(buttons[9], 1, 4);


        //
        pane.add(labels[10], 0, 5);

        pane.add(buttons[10], 1, 5);

        //
        pane.add(labels[11], 0, 6);

        pane.add(buttons[11], 1, 6);

        return pane;
    }
}
Run Code Online (Sandbox Code Playgroud)

Jam*_*s_D 6

GridPane确实是JavaFX中与Swing最接近的等价物GridBagLayout.通过使用ColumnConstraintsRowConstraints对象,您可以很好地控制空间到列和行的分配.这些可以分配绝对最小/最大/最大尺寸(列的宽度和行的高度),或者可以分配总宽度/高度的百分比.如果GridPane增长大于首选大小,您还可以为增长分配优先级,如果单元格包含的空间多于其节点使用的空间,则还可以分配对齐属性.

另外,有一些静态方法GridPane可以在节点上设置属性; 这允许在逐个节点的基础上控制对齐和增加优先级,还允许您为每个节点指定边距.

例如,在您的layoutMiscPane()方法中,您可能会这样做

ColumnConstraints leftCol = new ColumnConstraints();
leftCol.setHalignment(HPos.RIGHT);
ColumnConstraints rightCol = new ColumnConstraints();
rightCol.setHgrow(Priority.ALWAYS);
rightCol.setfillWidth(true);

pane.getColumnConstraints().addAll(leftCol, rightCol);
Run Code Online (Sandbox Code Playgroud)

请参阅文档GridPane以及for ColumnConstraintsRowConstraints.