【发布时间】:2011-11-08 11:17:09
【问题描述】:
通常,如果需要,FlowLayout 会使用多行。显然,如果具有 FlowLayout 的组件本身是 GridBagLayout 的一部分,则不会发生这种情况。
考虑这段代码:
import java.awt.*;
import javax.swing.*;
public class Xyzzy extends JFrame{
public static void main(String[] args) {
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
Xyzzy frame = new Xyzzy();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new GridBagLayout());
JPanel top = new JPanel();
top.setLayout(new FlowLayout());
for (int i=1; i<=30; ++i)
top.add(new JLabel(String.format("Label #%d",i)));
GridBagConstraints c = new GridBagConstraints();
c.weightx = 1.0;
c.gridwidth = GridBagConstraints.REMAINDER;
c.anchor = GridBagConstraints.CENTER;
frame.add(top,c);
frame.add(new JLabel("Bottom"),c);
//top.setPreferredSize(new Dimension(500,300));
frame.setSize(600, 600);
frame.setVisible(true);
}
});
}
}
此代码旨在将 JLabels “Label #1”、“Label #2”等显示在多行上,但实际上它只使用了一行。
我可以通过在上述代码中调用 setPreferredSize 之前删除“//”来强制它使用多行,但这需要我同时设置宽度和高度,我不知道要设置什么高度利用。 (我不能使用 FontMetrics 来计算高度,因为在我的实际情况下,JLabels 实际上是不同大小的小型 JPanel。)
那么有没有办法强制 FlowLayout 使用多行呢? (或者,当组件的宽度已知时,有没有办法计算组件所需的高度?)
【问题讨论】:
-
您考虑过使用其他布局管理器吗?