通常,如果需要,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 来计算高度,因为在我的实际情况下,JLabel 实际上是不同大小的小 JPanel。)
那么有没有办法强制FlowLayout使用多行呢? (或者,有没有一种方法可以在已知组件宽度的情况下计算组件所需的高度?)
最佳答案
尝试添加约束参数:
c.weighty = 1.0;
c.fill = GridBagConstraints.VERTICAL;
它应该允许在垂直方向上使用 FlowLayout 增加面板。
关于java - FlowLayout 在 GridBagLayout 中不使用多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8049561/