如何使用 BoxLayout 让组件延伸到整行?
How can get components to stretch across an entire row using BoxLayout?
我正在查看 How To Use BoxLayout 文档,其中清楚地说明了
What if none of the components has a maximum width? In this case, if
all the components have identical X alignment, then all components are
made as wide as their container.
假设我们要向 JPanel
添加很多 JButton
个实例。如果这些按钮的最大宽度是 none 并且我们在所有这些按钮上调用 setAlignmentX(Component.LEFT_ALIGNMENT)
- 那么这些按钮中的每一个都应该横跨其整行。文档甚至使用下图说明了这一点。
我无法让它工作!
我试过在按钮上执行 setMaximumSize(null
) 和 setMaximumSize(new Dimension(-1,-1))
和 setMaximumSize(new Dimension(0,0))
,但没有给我描述的行为。
文档中的确切含义是什么:
What if none of the components has a maximum width?
none的最大宽度是多少?
我能制作的最好的是下面的。阅读文档我希望按钮应该能够跨越它们的整行。我知道我也可以为此使用其他布局管理器,但我想用 BoxLayout
来实现这一点(假设文档是正确的/我理解文档是正确的)。
public class CustomList extends JPanel {
private final Box box = Box.createVerticalBox();
public CustomList() {
for (int i = 0; i < 10; i++) {
JButton b = new JButton("Button item" + i);
//b.setMaximumSize(new Dimension(0,0));
b.setAlignmentX(Component.LEFT_ALIGNMENT);
box.add(b);
}
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(box, BorderLayout.CENTER);
}
public static void main(String[] args) {
CustomList l = new CustomList();
l.setSize(200, 200);
l.setBackground(Color.red);
JFrame frame = new JFrame("Vertical Box");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(l, BorderLayout.CENTER);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
您的按钮实际上有最大宽度。
你可以做的是在你的循环中创建 JPanel
个带有 BorderLayout
的对象,将每个按钮添加到每个面板(添加到 BorderLayout.CENTER
,这是默认设置)。
BorderLayout.CENTER
不关心其子 Component
的最大大小,因此您最终得到一个 JPanel
,其全部内容由 JButton
填充.
因为 JPanel
本身有一个巨大的默认最大尺寸 new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)
(这是 width=32767,height=32767 !!)这是 Component
的默认最大尺寸,你会得到预期的结果:
public CustomList() {
for (int i = 0; i < 10; i++) {
JPanel panel = new JPanel(new BorderLayout());
JButton b = new JButton("Button item" + i);
//b.setMaximumSize(new Dimension(0,0));
b.setAlignmentX(Component.LEFT_ALIGNMENT);
panel.add(b);
box.add(panel);
}
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(box, BorderLayout.CENTER);
}
我正在查看 How To Use BoxLayout 文档,其中清楚地说明了
What if none of the components has a maximum width? In this case, if all the components have identical X alignment, then all components are made as wide as their container.
假设我们要向 JPanel
添加很多 JButton
个实例。如果这些按钮的最大宽度是 none 并且我们在所有这些按钮上调用 setAlignmentX(Component.LEFT_ALIGNMENT)
- 那么这些按钮中的每一个都应该横跨其整行。文档甚至使用下图说明了这一点。
我无法让它工作!
我试过在按钮上执行 setMaximumSize(null
) 和 setMaximumSize(new Dimension(-1,-1))
和 setMaximumSize(new Dimension(0,0))
,但没有给我描述的行为。
文档中的确切含义是什么:
What if none of the components has a maximum width?
none的最大宽度是多少?
我能制作的最好的是下面的。阅读文档我希望按钮应该能够跨越它们的整行。我知道我也可以为此使用其他布局管理器,但我想用 BoxLayout
来实现这一点(假设文档是正确的/我理解文档是正确的)。
public class CustomList extends JPanel {
private final Box box = Box.createVerticalBox();
public CustomList() {
for (int i = 0; i < 10; i++) {
JButton b = new JButton("Button item" + i);
//b.setMaximumSize(new Dimension(0,0));
b.setAlignmentX(Component.LEFT_ALIGNMENT);
box.add(b);
}
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(box, BorderLayout.CENTER);
}
public static void main(String[] args) {
CustomList l = new CustomList();
l.setSize(200, 200);
l.setBackground(Color.red);
JFrame frame = new JFrame("Vertical Box");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(l, BorderLayout.CENTER);
frame.setSize(300, 200);
frame.setVisible(true);
}
}
您的按钮实际上有最大宽度。
你可以做的是在你的循环中创建 JPanel
个带有 BorderLayout
的对象,将每个按钮添加到每个面板(添加到 BorderLayout.CENTER
,这是默认设置)。
BorderLayout.CENTER
不关心其子 Component
的最大大小,因此您最终得到一个 JPanel
,其全部内容由 JButton
填充.
因为 JPanel
本身有一个巨大的默认最大尺寸 new Dimension(Short.MAX_VALUE, Short.MAX_VALUE)
(这是 width=32767,height=32767 !!)这是 Component
的默认最大尺寸,你会得到预期的结果:
public CustomList() {
for (int i = 0; i < 10; i++) {
JPanel panel = new JPanel(new BorderLayout());
JButton b = new JButton("Button item" + i);
//b.setMaximumSize(new Dimension(0,0));
b.setAlignmentX(Component.LEFT_ALIGNMENT);
panel.add(b);
box.add(panel);
}
setLayout(new BoxLayout(this, BoxLayout.PAGE_AXIS));
add(box, BorderLayout.CENTER);
}