动态增长的JPanel用的BoxLayout(对空布局)(Dynamically growing J

2019-07-18 03:52发布

我有一个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所以请不要认为我不使用空布局。 我必须使用空布局。 “总”的空布局不应该的答案影响到我的问题,其重点是“盒子”面板上。

Answer 1:

通过扔掉布局管理器,你突然它的工作成为负责任。 作业我要补充,这是不容易...

基本上,给你举例来说,你无法设置子组件的大小...

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的成分变更过程的好处,而无需求助于ComponentListenersContainerListeners

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的是如何设计的作品...



Answer 2:

建议:

  • 不要使用空布局,几乎不断。
  • 为什么不给总JPanel一个BorderLayout
  • 然后添加BoxLayout使用JPanelBorderLayout.NORTH (或也称为BorderLayout.PAGE_START )位置。

编辑
幽州

IN ADVANCE:我需要的“盒子”的位置是在准确100,200所以请不要认为我不使用空布局。 我必须使用空布局。 “总”的空布局不应该的答案影响到我的问题,其重点是“盒子”面板上。

我认为你再次把不必要的限制,在你的程序。 您可以在100轻松地在该尺寸的空边框围绕它把你的“盒子”,200,或通过其他方式。 但得到的答复是没有扔出去使用空布局。



Answer 3:

蝙蝠,我会改变:

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开始失控的看法。 祝好运!



Answer 4:

也许是因为你还没有的setSize框中的JPanel。



文章来源: Dynamically growing JPanel with BoxLayout (on a null layout)