我使用GridLayout(3x3)创建了一个包含9个JPanel的JFrame子类。我正在尝试设计一种随机重新排列JFrame中的JPanel的方法。这是我到目前为止所做的:
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();
}
运行此方法后,JPanels在GridLayout中的位置与以前完全相同!我已经确认JFrame确实正在重新绘制,我的堆栈正在被洗牌,并且removeAll()
和add()
方法正在运行。内容窗格似乎记住了JPanel的位置,因此重新排序add()
调用似乎不起作用。
我在哪里弄错了?有没有人知道在布局中改变JPanels位置的更好方法?提前谢谢!
答案 0 :(得分:3)
也许您的问题是在向其添加组件后需要在容器上调用revalidate。这告诉布局管理员做他们的事情 - 布局他们包含的组件。
((JPanel)getContentPane()).revalidate();
getContentPane().repaint();
答案 1 :(得分:0)
我怀疑你使用堆栈是个问题。请尝试将其更改为列表。
List<Component> panels = new ArrayList<Component>();
for(Component c : this.getContentPane().getComponents())
panels.add(c);
this.getContentPane().removeAll();
Collections.shuffle(panels);
this.getContentPane().setLayout(new GridLayout(3,3));
for(Component c: panels){
this.getContentPane().add(c);
}