Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/341.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing GroupLayout:调整和限制组件大小_Java_Swing_Grouplayout - Fatal编程技术网

Java Swing GroupLayout:调整和限制组件大小

Java Swing GroupLayout:调整和限制组件大小,java,swing,grouplayout,Java,Swing,Grouplayout,我使用GroupLayout来管理一些动态生成的数据输入表单中的组件。布局大致如下: *-----------------------------------------------* | label A | field A | | label B | field B | | label C | field C | *-----

我使用
GroupLayout
来管理一些动态生成的数据输入表单中的组件。布局大致如下:

*-----------------------------------------------*
| label A     |   field A                       | 
| label B     |   field B                       |
| label C     |   field C                       |
*-----------------------------------------------*
我在水平布局中使用了两个平行组,在垂直布局中使用了一个顺序组。在大多数情况下,一切都很顺利

我想将标签的最大宽度(仅是
JLabel
的实例)限制为父
JFrame
宽度的1/3。如果
JFrame
是一个固定的大小,这将是微不足道的,但我必须处理它的大小

我正在从
JFrame
接收
ComponentListener.componentResistized()
事件,但我有点纠结于收到此类事件后该怎么办

我尝试过这种方法,但没有任何运气:

public void componentResized(ComponentEvent e) {
    int maxW = parentFrame.getWidth() / 3;
    for (JLabel l : labels) {
        l.setMaximumSize( // have also tried setSize() and setPreferredSize()
            new Dimension(
                Math.min(l.getSize().width, maxW),
                l.getMaximumSize().height));
    }
    groupLayout.invalidateLayout(getContentSpace());
}
有人能建议一种限制标签宽度的方法吗


我可能每次都可以从头开始重建布局,但我觉得应该有一种更简单的方法。

在本例中,
GroupLayout
可以简单地依赖标签的首选大小,而不必求助于任何
setXXXSize()
方法。在这种方式下,

  • 标签的空间始终容纳最大的标签
  • 文本字段以一种有用的方式调整大小
  • 结果是正确的跨平台和字体
  • “您不需要为大多数组件指定任何内容……因为组件本身具有所需的默认大小调整行为。”-
使用
GroupLayout.Alignment.training
右对齐标签是个人偏好,我还添加了第二个面板来展示它如何嵌套在另一个布局中

import java.awt.EventQueue;
import javax.swing.BorderFactory;
import javax.swing.Box;
import javax.swing.BoxLayout;
import javax.swing.GroupLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

/** @see http://stackoverflow.com/questions/8492065 */
public class GroupPanel extends JPanel {

    private JLabel label1 = new JLabel("Primary:");
    private JTextField field1 = new JTextField(16);
    private JLabel label2 = new JLabel("Secondary:");
    private JTextField field2 = new JTextField(16);
    private JLabel label3 = new JLabel("Tertiary:");
    private JTextField field3 = new JTextField(16);

    public GroupPanel(int n) {
        this.setBorder(BorderFactory.createTitledBorder("Panel " + n));
        GroupLayout layout = new GroupLayout(this);          
        this.setLayout(layout);
        layout.setAutoCreateGaps(true);
        layout.setAutoCreateContainerGaps(true);
        layout.setHorizontalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.TRAILING)
                .addComponent(label1)
                .addComponent(label2)
                .addComponent(label3))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.LEADING)
                .addComponent(field1)
                .addComponent(field2)
                .addComponent(field3))
        );
        layout.setVerticalGroup(layout.createSequentialGroup()
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label1)
                .addComponent(field1))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label2)
                .addComponent(field2))
            .addGroup(layout.createParallelGroup(GroupLayout.Alignment.BASELINE)
                .addComponent(label3)
                .addComponent(field3))
        );
    }

    private static void display() {
        JFrame f = new JFrame("GroupPanel");
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.setLayout(new BoxLayout(f.getContentPane(), BoxLayout.Y_AXIS));
        f.add(new GroupPanel(1));
        f.add(new GroupPanel(2));
        f.add(Box.createVerticalGlue());
        f.pack();
        f.setLocationRelativeTo(null);
        f.setVisible(true);
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                display();
            }
        });
    }
}


永远不要设置XXSIZE:是否有任何理由让标签比最大标签的首选尺寸更大?@trashgood没有。我想设置标签宽度的上限,而不是最小值。我对问题进行了编辑,使之更清楚。这是一个非常清楚的例子,所以谢谢你。您提供的代码与我自己已经实现的代码几乎相同,但关键是“您不需要为大多数组件指定任何内容……因为组件本身具有所需的默认大小调整行为。”。我认为我的标签需要是覆盖getPreferredSize()的自定义实现;还可以看到这个(不太灵活)。也可以看到这个(更灵活)。我在GroupLayout的使用之间间隔了五年,所以我不得不再次参考上面@trashgod的例子。这是一个很好的方法来刷新我对如何使用该布局的记忆。好极了!