有没有办法忽略preferredsize组件?

nom7f22z  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(305)

我使用gridbaglayout管理器来清楚地定义标签和jscrollpane应该在哪里(目前)。
我使用gridbagconstraint告诉第一个名为“label1”(带文本)的jlabel他应该是3个单位宽×1个单位高。我告诉另一个叫“blank”(空)的jlabel他应该有9个单位宽*1个单位高。
然后我声明一个jscrollpane,告诉它应该是y=1,height=11,x=0 width=12。
我将gridbag的containt的fill设置为both,因为我希望每个组件都填充我描述的矩形。
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) {
        /**/
    }
}

结果如下所述(高度相同):

我已经读过(我相信我基本上理解了)这个例子。

iaqfqrcu

iaqfqrcu1#

gridbaglayout中没有“单位”这样的概念。gbl使用单元格。
如果第一行有两个组件,那么就有两个单元格。每个单元的大小由单元中的组件决定。
如果您在第二行有一个组件,那么您有几个选项。组件可以显示在第一列或第二列中。或者您可以给组件一个“gridwidth”2,这意味着它将填充两列的宽度。
可以使用“weightx”约束。它指示在有额外空间可用时应如何将空间分配给组件。所以如果一个分量是.20,另一个是.80。这是按比例分配空间的最佳方法,但这仅适用于“额外”空间。每个组件最初将按其首选尺寸进行调整。
如果您想要真正的相对大小,那么您可以使用相对布局。它允许您指定相对于总可用空间的组件大小,因此可以忽略首选大小。
所以您需要使用 RelativeLayout 对于包含两个标签的第一行,然后使用gridbaglayout将该面板添加到面板中。

相关问题