我有一个JPanel上一个JPanel的顶部垂直的BoxLayout使用空布局。
我愿与BoxLayout的JPanel中,在添加的组件成长。
请参见下面的代码:
public static void main (String[] args) {
JFrame f = new JFrame();
f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel total = new JPanel();
total.setLayout(null);
total.setSize(f.getWidth(),f.getHeight());
total.setBackground(Color.green);
JPanel box = new JPanel();
box.setLocation(100,200);
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));
total.add(box);
f.add(total);
f.setVisible(true);
}
你会发现,没有任何部件出现。
我怎样才能让JPanel的“盒子”,使得大小动态地增加,因为我添加更多组件(其垂直添加)。
IN ADVANCE:我需要的“盒子”的位置是在准确100,200所以请不要认为我不使用空布局。 我必须使用空布局。 “总”的空布局不应该的答案影响到我的问题,其重点是“盒子”面板上。
通过扔掉布局管理器,你突然它的工作成为负责任。 作业我要补充,这是不容易...
基本上,给你举例来说,你无法设置子组件的大小...
JFrame f = new JFrame();
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel total = new JPanel();
total.setLayout(null);
total.setSize(f.getWidth(), f.getHeight());
total.setBackground(Color.green);
JPanel box = new JPanel();
box.setLocation(100, 200);
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));
box.setSize(100, 100); // <-- Don't forget this..
total.add(box);
f.add(total);
f.setVisible(true);
就个人而言,我觉得你找麻烦,但我什么都知道?
一个更好的想法可能是使用像一个EmptyBorder
提供填充...
JFrame f = new JFrame();
f.setSize(500, 500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel total = new JPanel(new BorderLayout());
total.setSize(f.getWidth(), f.getHeight());
total.setBackground(Color.green);
total.setBorder(new EmptyBorder(100, 200, 100, 200));
JPanel box = new JPanel();
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));
total.add(box);
f.add(total);
f.setVisible(true);
更新了布局管理例子
现在,如果所有的布局管理器是失败,你可以尝试写自己的。 这有您从需要的好处null
布局管理器与积分到Swing的成分变更过程的好处,而无需求助于ComponentListeners
和ContainerListeners
JPanel total = new JPanel();
total.setLayout(new SuperAwesomeBetterThenYoursLayout());
自定义布局管理
public static class SuperAwesomeBetterThenYoursLayout implements LayoutManager {
@Override
public void addLayoutComponent(String name, Component comp) {
}
@Override
public void removeLayoutComponent(Component comp) {
}
@Override
public Dimension preferredLayoutSize(Container parent) {
return new Dimension(100, 300);
}
@Override
public Dimension minimumLayoutSize(Container parent) {
return new Dimension(100, 300);
}
@Override
public void layoutContainer(Container parent) {
boolean laidOut = false;
for (Component child : parent.getComponents()) {
if (child.isVisible() && !laidOut) {
child.setLocation(200, 100);
child.setSize(child.getPreferredSize());
} else {
child.setSize(0, 0);
}
}
}
}
这基本上代表了你会无论如何都要做的工作,但确实在客场与Swing的是如何设计的作品...
建议:
- 不要使用空布局,几乎不断。
- 为什么不给总
JPanel
一个BorderLayout
? - 然后添加
BoxLayout
使用JPanel
到BorderLayout.NORTH
(或也称为BorderLayout.PAGE_START
)位置。
编辑
幽州
IN ADVANCE:我需要的“盒子”的位置是在准确100,200所以请不要认为我不使用空布局。 我必须使用空布局。 “总”的空布局不应该的答案影响到我的问题,其重点是“盒子”面板上。
我认为你再次把不必要的限制,在你的程序。 您可以在100轻松地在该尺寸的空边框围绕它把你的“盒子”,200,或通过其他方式。 但得到的答复是没有扔出去使用空布局。
蝙蝠,我会改变:
public static void main (String[] args) {
JFrame f = new JFrame();
//f.setSize(500,500);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel total = new JPanel();
//total.setLayout(null); //<-- this is usually a bad idea, but you can keep it
// if you want to specify an EXACT location
// for your JPanel
total.setPreferredSize(500, 500);
total.setBackground(Color.green);
JPanel box = new JPanel();
//box.setLocation(100,200);
box.setLayout(new BoxLayout(box, BoxLayout.Y_AXIS));
box.add(new JButton("test"));
box.add(new JLabel("hey"));
total.add(box);
f.add(total);
f.pack();
f.setVisible(true);
}
一旦你有了这个基础,所有你需要做的动态改变JPanel的大小是:
panel.setSize(width, heightOfComponentWithin * numberOfComponents);
container.repaint(); //<-- Im not sure if you also have to call panel.repaint(),
// you probably don't have to.
我也建议使用滚动视图,以防万一的JPanel开始失控的看法。 祝好运!
也许是因为你还没有的setSize框中的JPanel。