我目前正在尝试将应用程序迁移到JavaFX(实际上是部分地使用AWT),而将带有边框布局的JPanels切换到BorderPanes相当容易,但是我很难弄清楚如何使用GridBagLayout和GridPanes做到这一点。 。 (我以前从未在Swing中使用过此布局)
在我的代码中,GridBagLayout使用了2次(并且我不确定这是否是自动生成的代码):

JPanel bottomMessagePanel = new JPanel();
bottomMessagePanel.setLayout(new GridBagLayout());
bottomMessagePanel.setBorder(BorderFactory.createEmptyBorder());
bottomMessagePanel.add(someJComponent, new GridBagConstraints(0, 0, 1, 1, .35, 1, GridBagConstraints.WEST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
bottomMessagePanel.add(someOtherJComponent, new GridBagConstraints(1, 0, 1, 1, .65, 1, GridBagConstraints.CENTER, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));




JPanel stepPanel = new JPanel();
stepPanel.setLayout(new GridBagLayout());
stepPanel.add(someJComponent, new GridBagConstraints(1, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
stepPanel.add(someOtherJComponent, new GridBagConstraints(0, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));
stepPanel.add(some3rdJComponent, new GridBagConstraints(2, 0, 1, 1, 0, 0, GridBagConstraints.EAST, GridBagConstraints.BOTH, new Insets(0, 0, 0, 0), 0, 0));


我将如何使用JavaFX GridPane做到这一点?
不用担心转换那些JComponent,因为我已经转换了那些...

任何帮助都非常感谢!

最佳答案

您指定将值传递给构造函数的GridBagConstraints

GridBagConstraints(
        int gridx,
        int gridy,
        int gridwidth,
        int gridheight,
        double weightx,
        double weighty,
        int anchor,
        int fill,
        Insets insets,
        int ipadx,
        int ipady)


让我们描述如何在JavaFX中使用这些参数的等效项:

Node node = ...
GridPane gridPane = ...


gridx,Gridy,GridWidth,GridHeight

通常,您使用add的相应GridPane方法来指定这些值。在JavaFX中,它们分别称为columnIndexrowIndexcolumnSpanrowSpan。如果columnSpanrowSpan为1,则使用带有3个参数的add方法就足够了:

gridPane.add(node, gridx, gridy);


如果columnSpan / rowSpan之一较大,则可以使用该方法的重载版本:

gridPane.add(node, gridx, gridy, gridwidth, gridheight);


weightx,重

那些没有直接的等价物。相反,您需要使用percentWidthpercentHeight中的ColumnConstraintsRowConstraints为整个行/列定义此名称(除非您对标准布局感到满意)。

行和列约束将添加到columnConstraintsrowConstraints列表中。



您可以为此使用halignment / valignmentColumnConstrants / RowConstraints属性,或使用GridPane.setHalignmentGridPane.setValignment为单个节点指定此属性:

GridPane.setHalignment(node, HPos.LEFT);
GridPane.setValignment(node, VPos.TOP);




等效的方法是设置行约束和列约束的fillHeightfillWidth值,以使用GridPane.setFillWidthGridPane.setFillHeight为单个节点指定此值:

GridPane.setFillWidth(node, Boolean.FALSE);
GridPane.setFillHeight(node, Boolean.FALSE);


这些属性的默认值为true

插图

您可以使用GridPane.setMargin进行指定。如果对所有值都使用0,则无需指定此值。

GridPane.setMargin(node, new Insets(top, right, bottom, left));


ipadx,ipady

JavaFX中没有与此等效的功能。



static setConstraints个方法可让您一次设置多个约束,例如

setConstraints(Node child, int columnIndex, int rowIndex, int columnspan, int rowspan, HPos halignment, VPos valignment, Priority hgrow, Priority vgrow, Insets margin)

关于java - JPanel GridBagLayout到GridPane,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39414189/

10-11 20:16