我正在使用GroupLayout来管理一些动态生成的数据输入形式的组件。布局或多或少是这样的:

*-----------------------------------------------*
| label A     |   field A                       |
| label B     |   field B                       |
| label C     |   field C                       |
*-----------------------------------------------*

我在水平布局中使用2个并行组,在垂直布局中使用一个连续的组。在大多数情况下,一切都很好。

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

我正在从ComponentListener.componentResized()中获取JFrame事件,但是收到此类事件后我会做些事情。

我尝试这种方法没有任何运气:
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()方法。用这种方法

  • 标签的空间始终容纳最大的标签。
  • 可以使用一种有用的方式来调整文本字段的大小。
  • 结果在所有平台和字体上都是正确的。
  • “您无需为大多数组件指定任何内容,因为默认情况下组件本身具有所需的调整大小行为。” — How to Use GroupLayout: Component Size and Resizability

  • 使用GroupLayout.Alignment.TRAILING来正确对齐标签是个人喜好,并且我添加了第二个面板以显示它如何嵌套在另一个布局中。
    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();
                }
            });
        }
    }
    

    关于java - Swing GroupLayout : Resizing and limiting component sizes,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8492065/

    10-11 00:52