2011-01-14 5 views
3

GridLayout(3x3)を使用して9個のJPanelを含むJFrameサブクラスを作成しました。私は、JFrame内のJPanelをランダムに並べ替えるメソッドを設計しようとしています。ここで私がこれまで持っているものです。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();  
} 

このメソッドが実行された後、彼らが前にあったように、のJPanelはGridLayoutの中に正確に同じ位置にあります!私はJFrameが実際に再描画されていること、スタックがシャッフルされていること、そしてremoveAll()add()のメソッドが動作していることを確認しました。コンテンツペインはJPanelsの場所を記憶しているように見えるので、add()コールの並べ替えは機能していないようです。

ここで私は間違いをしていますか?レイアウト内のJPanelsの位置をシャッフルする良い方法を知っている人はいますか?前もって感謝します!

答えて

3

恐らく問題は、コンポーネントにコンポーネントを追加した後にコンテナでrevalidateを呼び出す必要があることです。これは、レイアウトマネージャに、それらが含むコンポーネントをレイアウトすることを指示します。

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

!ありがとう! – AndreiM

+0

あなたは歓迎しているが、それはまさに輝きではないのですが、むしろ経験...私は過去にこの2〜3時間で燃えてしまったので、決して忘れないでしょう:) –

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

運:(。ArrayListのと動作は同じである。 – AndreiM

+0

その後、コンポーネントを追加する前に、ブランドの新しいのGridLayoutを設定してみてください。ブリリアント –

関連する問題