在JFrame的内容窗格中重新排列JPanels?

时间:2011-01-14 21:59:00

标签: java swing

我使用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位置的更好方法?提前谢谢!

2 个答案:

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