Java 有没有办法忽略组件PreferredSize?

Java 有没有办法忽略组件PreferredSize?,java,swing,gridbaglayout,Java,Swing,Gridbaglayout,我正在使用GridBagLayout管理器来明确定义标签和JScrollPane的位置(目前) 我使用gridbagconstraint告诉第一个名为“label1”(带文本)的JLabel,他应该是3个单位宽*1个单位高。 我告诉另一个名叫“blank”(空)的JLabel,他应该有9个单位宽*1个单位高 然后我声明了一个JScrollPane,并告诉它应该在y=1,height=11,x=0,width=12 我将gridbag的containt的fill设置为两者,因为我希望每个组件都填充

我正在使用GridBagLayout管理器来明确定义标签和JScrollPane的位置(目前)

我使用gridbagconstraint告诉第一个名为“label1”(带文本)的JLabel,他应该是3个单位宽*1个单位高。 我告诉另一个名叫“blank”(空)的JLabel,他应该有9个单位宽*1个单位高

然后我声明了一个JScrollPane,并告诉它应该在y=1,height=11,x=0,width=12

我将gridbag的containt的fill设置为两者,因为我希望每个组件都填充我描述的矩形

label1应该是整个可用宽度的四分之一,但由于label1有一些文本,label1占用了2/3的空间

有没有一种方法可以像GridLayout那样忽略组件的首选大小

我已经阅读了有关这方面的文档,但没有找到任何线索

一些源代码:

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) {
        /**/
    }
}
公共类JPanelMain{
//网格约束
gbc的私有网格;
专用静态最终int min=1;
私有静态最终int maxSize=12;
私有静态final int forth=maxSize/4;
私有静态final int third=maxSize/3;
公共JPanelMain(JFrame){
JPanel窗格=新的JPanel();
setLayout(新的GridBagLayout());
gbc=新的网格约束(
0,//gridx
0,//gridy
0,//网格宽度
0,//gridheight
1,//权重x
1、//很重
GridBagConstraints.CENTER,//锚定
GridBagConstraints.BOTH,//fill
新插图(0,0,0,0),//插图
0,//padx
0//pady
);
JLabel label1=新的JLabel();
label1.setboorder(BorderFactory.createTitledBorder(“label1”));
JLabel blank=新的JLabel();
blank.setboorder(BorderFactory.createTitledBorder(“blank”);
label1.Set不透明(真);
gbc.gridwidth=(第三);
gbc.gridheight=(最小值);
窗格。添加(标签1,gbc);
label1.setText(“label1”);
空白。设置不透明(真);
gbc.gridx=第三;
gbc.gridwidth=maxSize-第三;
窗格。添加(空白,gbc);
gbc.gridy=min;
gbc.gridheight=最大尺寸-最小值;
gbc.gridx=0;
gbc.gridwidth=maxSize;
DefaultListModel患者=新建DefaultListModel();
填充(患者);
JList列表=新的JList(患者);
窗格。添加(新的JScrollPane(列表),gbc);
框架。添加(窗格);
}
专用空白填充(DefaultListModel模型){
/**/
}
}
结果如下所述(高度相同):


我读过(我相信大部分人都理解)GridBagLayout中没有“单位”这样的概念。GBL使用单元格

如果第一行有两个组件,则有两个单元格。每个单元的大小由单元中的组件决定

如果在第二行有一个组件,则有两个选项。组件可以显示在第一列或第二列中。或者您可以给组件一个2的“gridwidth”,这意味着它将填充两列的宽度

您可以使用“weightx”约束。它指示当有额外空间可用时,应如何将空间分配给组件。所以如果一个成分可以是.20,另一个是.80。这是按比例分配空间的最佳方法,但这仅适用于“额外”空间。每个组件最初将按其首选尺寸进行调整

如果您想要真正的相对大小,则可以使用。它允许您指定相对于总可用空间的构件尺寸,因此可以忽略首选尺寸


因此,您需要使用
RelativeLayout
为包含两个标签的第一行创建一个面板,然后使用GridBagLayout将该面板添加到面板中。

GridBagLayout中没有“单位”这样的概念。GBL使用单元格

如果第一行有两个组件,则有两个单元格。每个单元的大小由单元中的组件决定

如果在第二行有一个组件,则有两个选项。组件可以显示在第一列或第二列中。或者您可以给组件一个2的“gridwidth”,这意味着它将填充两列的宽度

您可以使用“weightx”约束。它指示当有额外空间可用时,应如何将空间分配给组件。所以如果一个成分可以是.20,另一个是.80。这是按比例分配空间的最佳方法,但这仅适用于“额外”空间。每个组件最初将按其首选尺寸进行调整

如果您想要真正的相对大小,则可以使用。它允许您指定相对于总可用空间的构件尺寸,因此可以忽略首选尺寸


因此,您需要使用
RelativeLayout
为包含两个标签的第一行创建一个面板,然后使用GridBagLayout将该面板添加到面板中。

当我说“2个单位宽”时,它只意味着我将约束设置为gridwidth=2,如代码中所述。我想这是可以理解的。我可以告诉我的gridbaglayout“不要管理额外空间吗?”吗?同样,你不能这样做。正如我所说的,你需要使用“细胞”。“gridwidth”仅与任何单行上的最大组件数相关。在您的示例中,有3个组件,一行2个,另一行1个。因此,只有第二行可以使用“gridwidth”约束,它的最大值只能是2,而不是9。请参阅更新以了解
相对版面。
。似乎这个相对版面确实正是我所需要的,非常感谢。但是我很失望,我不懂gridbaglayout的东西…@PierreAntoineGuillaume,
但是我很失望,我不懂gridbaglayout的东西。
看一下Swing tu的图片