有没有办法忽略组件 PreferredSize?
Is there a way to ignore components PreferredSize?
我正在使用 GridBagLayout 管理器来清楚地定义(目前)标签和 JScrollPane 应该在哪里。
我使用 gridbagconstraint 告诉第一个名为 "label1"(带文本)的 JLabel 他应该是 3 个单位宽 * 1 个单位高。
我告诉另一个名为 "blank"(空)的 JLabel 他应该是 9 个单位宽 * 1 个单位高。
然后我声明一个 JScrollPane,并告诉它它应该在 y=1、height = 11 和 x=0 width = 12 上。
我将gridbag的contraint's fill设置为BOTH,因为希望每个组件都填充我描述的矩形。
label1 应该是整个可用宽度的四分之一,但由于 label1 有一些文本,label1 占用了 space.
的 2/3
有没有办法像 GridLayout(某种)那样忽略组件的 PreferredSizes?
我已经阅读了相关文档,但没有找到任何线索。
一些源代码:
public class JPanelMain {
//gridconstraints
private GridBagConstraints gbc;
private static final int min = 1;
private static final int maxSize= 12;
private static final int forth =maxSize/4;
private static final int third =maxSize/3;
public JPanelMain(JFrame frame) {
JPanel pane = new JPanel();
pane.setLayout(new GridBagLayout());
gbc = new GridBagConstraints(
0,//gridx
0,//gridy
0,//gridwidth
0,//gridheight
1,//weightx
1,//weighty
GridBagConstraints.CENTER,//anchor
GridBagConstraints.BOTH,//fill
new Insets(0,0,0,0),//insets
0,//padx
0//pady
);
JLabel label1 = new JLabel ();
label1.setBorder(BorderFactory.createTitledBorder("Label1"));
JLabel blank = new JLabel();
blank.setBorder(BorderFactory.createTitledBorder("blank"));
label1.setOpaque(true);
gbc.gridwidth =(third);
gbc.gridheight = (min);
pane.add(label1,gbc);
label1.setText("Label1");
blank.setOpaque(true);
gbc.gridx = third;
gbc.gridwidth = maxSize -third;
pane.add(blank,gbc);
gbc.gridy = min;
gbc.gridheight = maxSize - min;
gbc.gridx= 0;
gbc.gridwidth=maxSize;
DefaultListModel<String> patients = new DefaultListModel<>();
fill(patients);
JList<String> list = new JList<>(patients);
pane.add(new JScrollPane(list),gbc);
frame.add(pane);
}
private void fill (DefaultListModel<String> model) {
/**/
}
}
结果如描述(高度相同):
我读过(而且我相信大部分都理解了)example。
GridBagLayout中没有"units"这样的概念。 GBL 使用细胞。
如果第一行有两个组件,那么您就有两个单元格。每个单元格的大小由单元格中的组件决定。
如果你在第二行有一个组件,你有几个选择。该组件可以显示在第一列或第二列中。或者您可以给组件一个 "gridwidth" 2,这意味着它将填充两列的宽度。
您可以使用 "weightx" 约束。它指示当额外 space 可用时应如何将 space 分配给组件。因此,如果一个组件可以是 .20 而另一个是 .80。这是按比例分配 space 的最佳方式,但这仅适用于 "extra" space。每个组件最初将按其首选大小调整大小。
如果您想要真正的相对尺寸,那么您可以使用 Relative Layout。它允许您指定组件相对于可用总数 space 的大小,因此可以忽略首选大小。
因此您需要使用 RelativeLayout
为包含两个标签的第一行创建面板,然后使用 GridBagLayout 将该面板添加到面板。
我正在使用 GridBagLayout 管理器来清楚地定义(目前)标签和 JScrollPane 应该在哪里。
我使用 gridbagconstraint 告诉第一个名为 "label1"(带文本)的 JLabel 他应该是 3 个单位宽 * 1 个单位高。 我告诉另一个名为 "blank"(空)的 JLabel 他应该是 9 个单位宽 * 1 个单位高。
然后我声明一个 JScrollPane,并告诉它它应该在 y=1、height = 11 和 x=0 width = 12 上。
我将gridbag的contraint's fill设置为BOTH,因为希望每个组件都填充我描述的矩形。
label1 应该是整个可用宽度的四分之一,但由于 label1 有一些文本,label1 占用了 space.
的 2/3有没有办法像 GridLayout(某种)那样忽略组件的 PreferredSizes?
我已经阅读了相关文档,但没有找到任何线索。
一些源代码:
public class JPanelMain {
//gridconstraints
private GridBagConstraints gbc;
private static final int min = 1;
private static final int maxSize= 12;
private static final int forth =maxSize/4;
private static final int third =maxSize/3;
public JPanelMain(JFrame frame) {
JPanel pane = new JPanel();
pane.setLayout(new GridBagLayout());
gbc = new GridBagConstraints(
0,//gridx
0,//gridy
0,//gridwidth
0,//gridheight
1,//weightx
1,//weighty
GridBagConstraints.CENTER,//anchor
GridBagConstraints.BOTH,//fill
new Insets(0,0,0,0),//insets
0,//padx
0//pady
);
JLabel label1 = new JLabel ();
label1.setBorder(BorderFactory.createTitledBorder("Label1"));
JLabel blank = new JLabel();
blank.setBorder(BorderFactory.createTitledBorder("blank"));
label1.setOpaque(true);
gbc.gridwidth =(third);
gbc.gridheight = (min);
pane.add(label1,gbc);
label1.setText("Label1");
blank.setOpaque(true);
gbc.gridx = third;
gbc.gridwidth = maxSize -third;
pane.add(blank,gbc);
gbc.gridy = min;
gbc.gridheight = maxSize - min;
gbc.gridx= 0;
gbc.gridwidth=maxSize;
DefaultListModel<String> patients = new DefaultListModel<>();
fill(patients);
JList<String> list = new JList<>(patients);
pane.add(new JScrollPane(list),gbc);
frame.add(pane);
}
private void fill (DefaultListModel<String> model) {
/**/
}
}
结果如描述(高度相同):
我读过(而且我相信大部分都理解了)example。
GridBagLayout中没有"units"这样的概念。 GBL 使用细胞。
如果第一行有两个组件,那么您就有两个单元格。每个单元格的大小由单元格中的组件决定。
如果你在第二行有一个组件,你有几个选择。该组件可以显示在第一列或第二列中。或者您可以给组件一个 "gridwidth" 2,这意味着它将填充两列的宽度。
您可以使用 "weightx" 约束。它指示当额外 space 可用时应如何将 space 分配给组件。因此,如果一个组件可以是 .20 而另一个是 .80。这是按比例分配 space 的最佳方式,但这仅适用于 "extra" space。每个组件最初将按其首选大小调整大小。
如果您想要真正的相对尺寸,那么您可以使用 Relative Layout。它允许您指定组件相对于可用总数 space 的大小,因此可以忽略首选大小。
因此您需要使用 RelativeLayout
为包含两个标签的第一行创建面板,然后使用 GridBagLayout 将该面板添加到面板。