当前位置: 首页 > 知识库问答 >
问题:

使用BoxLayout动态增长JPanel(在空布局上)

杨腾
2023-03-14

我有一个具有垂直BoxLayout的JPanel,它位于具有空布局的JPanel之上。

我希望JPanel与BoxLayout增长,因为组件正在被添加。

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);
}

提前:我需要的“盒子”的位置正好在100,200,所以请不要建议我不使用空布局。我必须使用空布局。“total”的空布局不应该影响我的问题的答案,我的问题集中在“box”面板上。

共有1个答案

陈项禹
2023-03-14

通过扔掉布局管理器,您突然变得负责它的工作。我想补充一下,这不容易...

基本上,举个例子,您无法设置子组件的大小······

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);

就我个人而言,我认为你在自找麻烦,但我知道...

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);
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设计方式相一致的方式进行的...

 类似资料:
  • 问题内容: 所以我有一个叫做extends 的类。它使用空布局。我如何将其用作常规组件?当我将它放在另一个窗口中然后添加到窗口中时,它消失了。仅当我直接将其添加到窗口时,它才可见。 编辑:是的,我意识到使用带有null布局的A是不好的做法。实际上是别人的代码,我正在尝试将其用于我的目的,而不必重构它。 问题答案: 仅当我直接将其添加到窗口时,它才可见。 这是因为默认情况下,窗口使用BorderLa

  • 问题内容: 我在XML中定义了以下布局: 如何使用LayoutInflater来获取ListView和ProgressBar并在代码中分配它? 问题答案: 通过这种方式:

  • 我需要在中制作这样的表。 有什么想法如何做到这一点,以获得像下面图片上的布局吗?

  • 我正在构建一个带有Swing的桌面应用程序,其功能与Twitter类似。我有一个“feed”页面,其中显示“tweets”。 我在JPanel中有“tweets”,希望通过在JPanel顶部放置新的“tweets”并向下移动旧的“tweets”来动态显示新的tweets。我试图通过使用jpanel来使用MigLayout实现这一点。添加(tweet,“cell 0,wrap”)然而,这并没有按预期

  • 问题内容: 我是Android开发的新手,已经开始创建自己的UI。我看到您可以动态创建它,如下所示(Dynamic Layouts ): 但我也看到netbeans有一个文件 Resources- > layout-> main.xml 。因此,您可以为UI创建XML布局(声明XML布局): 所以我的问题是应该使用哪个?在Android开发中,对动态布局和XML布局有何建议和优缺点? 问题答案: