2012-02-07 12 views
5

からここでの問題点を説明するコードの実行可能な作品です。
これは、デフォルトのレイアウトでも同じ動作が見られるため、MigLayout関連(私はそれを使用することになります)とは思われません。まず動的に削除するコンポーネントをJPanelの


import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Dimension; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

import net.miginfocom.swing.MigLayout; 

public class MyFrame2 extends JFrame { 
    private JPanel main; 
    private JPanel s1; 
    private JPanel s2; 
    private JPanel s3; 

    public static void main(String[] args) throws InterruptedException { 
     MyFrame2 f = new MyFrame2(); 
     f.setVisible(true); 
     Thread.sleep(2000); //you can see all three panels for two seconds 

     f.main.remove(f.s1); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s2); 
     f.main.validate(); 
     Thread.sleep(2000); 
     f.main.remove(f.s3); 
     f.main.validate(); 
    } 

    public MyFrame2() { 
     main = new JPanel(); 

     main.setLayout(new MigLayout()); 

     main.add(new JLabel("Why does s3 not disappear?"),"w 200, h 100, wrap"); 

     s1 = new JPanel(); 
     s1.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s1")); 
     main.add(s1,"w 90%, h 300, wrap"); 

     s2 = new JPanel(); 
     s2.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s2")); 
     main.add(s2,"w 90%, h 300, wrap"); 

     s3 = new JPanel(); 
     s3.setBorder(BorderFactory.createTitledBorder(BorderFactory.createLineBorder(Color.GRAY,1),"s3")); 
     main.add(s3,"w 90%, h 300, wrap"); 

     getContentPane().setLayout(new BorderLayout()); 
     getContentPane().add(main, BorderLayout.CENTER); 

     setSize(new Dimension(800, 600)); 

    } 
} 

答えて

11

コール、:

f.repaint(50L); 

最後の検証は、レイアウトする変更されませんので。

+0

ありがとうございます。できます! (+1)。少し詳しく教えていただけますか?前回のバリデーションでレイアウトを変更しなかったのはなぜですか? (明らかに私は多くのスイングの開発をしていない!) –

+2

最後のバリデーション*はレイアウトを変更する - あなたはそれを見ない。最後のコンポーネントは、実際に検証の呼び出し後に削除されましたが、コンポーネントを再描画して、この除去の視覚的証拠を確認する必要があります。 –

+0

@HovercraftFullOfEels:ありがとうございます。 –

5

、SwingのGUIオブジェクトを構築し、event dispatch threadのみを操作していますが、EDT上で寝てはならないしなければなりません。代わりに、hereのように、時刻をマークするのにjavax.swing.Timerを使用してください。最後f.validate()後の終わりに

+0

ありがとうございました。これは、問題をデモするための素早いハックでした。 –

+1

@amol:兄弟コンポーネントは影響を受け、サイズが変更され、検証で再描画されなければなりませんでした。最後のコンポーネントは、このような再描画をトリガしませんでした。 (このコメントの申し訳ありません間違った場所) –

関連する問題