首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有没有一种忽略组件PreferredSize的方法?

有没有一种忽略组件PreferredSize的方法?
EN

Stack Overflow用户
提问于 2016-05-10 14:47:26
回答 1查看 66关注 0票数 0

我使用GridBagLayout管理器来清楚地定义(目前)标签和JScrollPane应该在哪里。

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

然后我声明一个JScrollPane,并告诉它它应该在y=1上,身高= 11,x=0宽度= 12。

我将网格包的禁忌填充设置为两者,因为希望每个组件都填充我描述的矩形。

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

是否有一种方法可以忽略组件的PreferredSizes,就像GridLayout (某种程度上)那样?

我看过这方面的文档,但没有找到任何线索。

一些源代码:

代码语言:javascript
复制
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) {
        /**/
    }
}

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

我读过(而且我相信大多数人都理解) 示例

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-05-10 15:06:48

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

如果第一行有两个组件,那么就有两个单元格。每个单元格按单元格中的组件大小。

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

您可以使用“加权”约束。它指示在有额外空间时,应如何将空间分配给组件。因此,如果一个组件可以是.20,另一个可以是.80。这是按比例分配空间的最佳方法,但这只适用于“额外”空间。每个组件最初都将按其首选大小进行调整。

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

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37141927

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档