我使用GridLayout(3x3)创建了一个包含9个JPanel的JFrame子类。我正在尝试设计一种在JFrame中随机重新排列JPanels的方法。这是我到目前为止的内容:

public void shuffle() {
    Stack<Component> panels = new Stack<Component>();
    for(Component c : this.getContentPane().getComponents())
      panels.push(c);

    this.getContentPane().removeAll();
    Collections.shuffle(panels);

    while(!panels.isEmpty())
      this.getContentPane().add(panels.pop());

    this.repaint();
}

运行此方法后,JPanel在GridLayout中的位置与以前完全相同!我已经确认JFrame确实被重新粉刷了,我的堆栈被打乱了,并且removeAll()add()方法正在工作。内容窗格似乎在记住JPanel的位置,因此重新排序add()调用似乎不起作用。

我在哪里弄错了?有谁知道改变布局中JPanels位置的更好方法?提前致谢!

最佳答案

也许您的问题是在向容器添加组件后需要在容器上调用revalidate。这告诉布局管理者去做自己的事情-布局其中包含的组件。

((JPanel)getContentPane()).revalidate();
getContentPane().repaint();

08-03 23:25