如何将组件堆叠在另一个组件上以保持其垂直尺寸?
How to stack components on another so that they'd keep their vertical size?
我有一个父 JPanel,其子组件堆叠在另一个 JPanel 上。但是它们不会像我想的那样调整大小:
This is how it should be
This is what I get
代码:
public class LayoutTest extends JFrame {
public LayoutTest() {
setVisible(true);
setSize(new Dimension(500, 500));
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
for (int i = 0; i < 2; i++) {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(500, 50));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.setBackground(Color.red);
getContentPane().add(panel);
}
}
public static void main(String[] args) {
LayoutTest layoutTest = new LayoutTest();
}
}
问题主要是组件在不应该的情况下垂直调整大小。我希望它们保持垂直尺寸,但它们不会。我尝试了多种布局,例如GridBagLayout、FlowLayout、BoxLayout,但其中 none 有效。
我最好的尝试是使用 BoxLayout:
简单地说:container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS);
然后 container.add(component1)
...
感谢任何帮助。
camickr 的工作解决方案:
public class LayoutTest extends JFrame {
public LayoutTest() {
setVisible(true);
setSize(new Dimension(500, 500));
JPanel container = new JPanel();
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
for (int i = 0; i < 2; i++) {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(500, 50));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.setBackground(Color.red);
container.add(panel, BorderLayout.PAGE_START);
}
getContentPane().add(container, BorderLayout.NORTH);
}
public static void main(String[] args) {
LayoutTest layoutTest = new LayoutTest();
}
}
当 space 可用时,BoxLayout 会将组件增长到最大尺寸。
当您将面板添加到框架时,不是将它添加到中心,这样面板会变大,而是将它添加到 PAGE_START 以考虑高度:
JPanel north = new JPanel();
north.setLayout( new BoxLayout(north, BoxLayout.PAGE_AXIS) );
// add loop to add panels to the "north" panel
add(north, BorderLayout.PAGE_START);
另一种解决方案是使用框布局将面板包裹到另一个面板中。
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel. BoxLayout.PAGE_AXIS) );
// create your loop to add child panels
JPanel wrapper = new JPanel(); // uses FlowLayout by default which respects the preferred size.
wrapper.add( panel );
frame.add( wrapper );
我有一个父 JPanel,其子组件堆叠在另一个 JPanel 上。但是它们不会像我想的那样调整大小:
This is how it should be
This is what I get
代码:
public class LayoutTest extends JFrame {
public LayoutTest() {
setVisible(true);
setSize(new Dimension(500, 500));
getContentPane().setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));
for (int i = 0; i < 2; i++) {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(500, 50));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.setBackground(Color.red);
getContentPane().add(panel);
}
}
public static void main(String[] args) {
LayoutTest layoutTest = new LayoutTest();
}
}
问题主要是组件在不应该的情况下垂直调整大小。我希望它们保持垂直尺寸,但它们不会。我尝试了多种布局,例如GridBagLayout、FlowLayout、BoxLayout,但其中 none 有效。
我最好的尝试是使用 BoxLayout:
简单地说:container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS);
然后 container.add(component1)
...
感谢任何帮助。
camickr 的工作解决方案:
public class LayoutTest extends JFrame {
public LayoutTest() {
setVisible(true);
setSize(new Dimension(500, 500));
JPanel container = new JPanel();
container.setLayout(new BoxLayout(container, BoxLayout.PAGE_AXIS));
for (int i = 0; i < 2; i++) {
JPanel panel = new JPanel();
panel.setPreferredSize(new Dimension(500, 50));
panel.setBorder(BorderFactory.createLineBorder(Color.BLACK));
panel.setBackground(Color.red);
container.add(panel, BorderLayout.PAGE_START);
}
getContentPane().add(container, BorderLayout.NORTH);
}
public static void main(String[] args) {
LayoutTest layoutTest = new LayoutTest();
}
}
当 space 可用时,BoxLayout 会将组件增长到最大尺寸。
当您将面板添加到框架时,不是将它添加到中心,这样面板会变大,而是将它添加到 PAGE_START 以考虑高度:
JPanel north = new JPanel();
north.setLayout( new BoxLayout(north, BoxLayout.PAGE_AXIS) );
// add loop to add panels to the "north" panel
add(north, BorderLayout.PAGE_START);
另一种解决方案是使用框布局将面板包裹到另一个面板中。
JPanel panel = new JPanel();
panel.setLayout( new BoxLayout(panel. BoxLayout.PAGE_AXIS) );
// create your loop to add child panels
JPanel wrapper = new JPanel(); // uses FlowLayout by default which respects the preferred size.
wrapper.add( panel );
frame.add( wrapper );