有没有办法忽略组件PreferredSize?

时间:2016-05-10 14:47:26

标签: java swing gridbaglayout

我正在使用GridBagLayout Manager清楚地定义thow标签和JScrollPane应该在哪里(现在)。

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

然后我宣布一个JScrollPane,告诉它它应该在y = 1,height = 11,x = 0 width = 12。

我将gridbag的约束填充设置为BOTH,因为希望每个组件都填充我描述的矩形。

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

有没有办法忽略组件的PreferredSizes,就像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) {
        /**/
    }
}

结果如上所述(高度相同):Label with text sized after its prefered size, despite the constraints

我已经阅读(我相信大多数人都知道)example

1 个答案:

答案 0 :(得分:2)

没有像#34;单位&#34;这样的概念。在GridBagLayout中。 GBL使用单元格。

如果第一行有两个组件,那么你有两个单元格。每个单元格由单元格中的组件确定大小。

如果你在第二行有一个组件,你有几个选项。该组件可以显示在第一列或第二列中。或者你可以给组件一个&#34; gridwidth&#34;为2,这意味着它将填充两列的宽度。

您可以使用&#34; weightx&#34;约束。它指示在有额外空间可用时如何为组件分配空间。因此,如果一个组件可能是.20而另一个组件可能是.80。这是按比例分配空间的最佳方式,但这仅适用于&#34; extra&#34;空间。每个组件最初的大小都是其首选大小。

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

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