我使用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();