Swing GroupLayout:调整和限制组件大小
我使用GroupLayout
来pipe理一些dynamic生成的数据input表单中的组件。 布局或多或less如此:
*-----------------------------------------------* | label A | field A | | label B | field B | | label C | field C | *-----------------------------------------------*
我为水平布局使用了2个并行组,而垂直布局使用了单个顺序组。 大多数情况下,一切都很好。
我想将标签的最大宽度(只是JLabel
实例)限制为父JFrame
宽度的1/3。 如果JFrame
是固定的大小,这将是微不足道的,但我必须处理它被resize。
我正在从JFrame
拾取ComponentListener.componentResized()
事件,但是当我收到这样的事件时,我有点卡住了。
我已经尝试了这个方法没有任何运气:
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()); }
任何人都可以提出一种方法来限制将工作的标签的宽度?
每次我都可以从头开始重新构build布局,但我觉得应该是一个更简单的方法。
在这个例子中, GroupLayout
可以简单地依赖标签的首选大小,而不必求助于任何setXXXSize()
方法。 在这个方法中,
- 标签的空间总是容纳最大的标签。
- 文本字段可以用有用的方式resize。
- 跨平台和字体的结果是正确的。
- “您不需要为大多数组件指定任何东西…因为组件本身具有所需的调整行为作为默认值。” – 如何使用GroupLayout:组件大小和可调整性
GroupLayout.Alignment.TRAILING
使用右alignment标签是个人偏好,我已经添加了第二个面板,以显示它如何嵌套在另一个布局。
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(); } }); } }