gpt4 book ai didi

java - Swing 组布局 : Resizing and limiting component sizes

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:04:55 24 4
gpt4 key购买 nike

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

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

我为水平布局使用了 2 个平行组,为垂直布局使用了一个顺序组。在大多数情况下,一切都运行良好。

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

我正在从 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());
}

谁能建议一种限制标签宽度的方法?

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

最佳答案

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

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

使用 GroupLayout.Alignment.TRAILING 来右对齐标签是个人喜好,我添加了第二个面板来展示它如何嵌套在另一个布局中。

enter image description here

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 组布局 : Resizing and limiting component sizes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8492065/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com