2012-01-14 10 views
4

私はすべての起動試行の約50%で始まる以下のJavaプログラムを持っています。残りの時間は、GUIを表示せずにバックグラウンドでデッドロックするように縫う。問題をJTextAreaオブジェクトのsetTextメソッドに追跡しました。 JButtonのような別のクラスを使用すると、setTextではなくJTextAreaデッドロックが機能します。これが起こって、どのような次のコードに問題があるさ、なぜ誰も私に説明することができます:SwingのJTextAreaでsetTextを使用するとデッドロックが発生する

public class TestDeadlock extends JPanel { 
private JTextArea text; 
TestDeadlock(){ 
    text = new JTextArea("Test"); 
    add(text); 
    updateGui(); 
} 
public static void main(String[] args){ 
    JFrame window = new JFrame(); 
    window.setTitle("Deadlock"); 
    window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    window.add(new TestDeadlock()); 
    window.pack(); 
    window.setVisible(true); 
} 

public synchronized void updateGui(){ 
    SwingUtilities.invokeLater(new Runnable(){ 
     public void run(){ 
      System.out.println("Here"); 
      text.setText("Works"); 
      System.out.println("Not Here"); 
     } 
    }); 
} 

}あなたの主な方法はinvokeLaterまたはinvokeAndWaitにラップする必要があります

+2

'invokeLater'を使用しないでください。このような振る舞いは、まだウィンドウを作成していないため、おそらくディスパッチスレッドが存在しないためです。あなたがそれを見せたときに作成されます。 –

+0

コメントをいただきありがとうございました。現在、この行動は私には意味があります – Christian

答えて

7

、それは基本的なスイングル​​ールを作成することですSwing GUI on EventDispashThread

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     public void run() { 
      JFrame window = new JFrame(); 
      window.setTitle("Deadlock"); 
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      window.add(new TestDeadlock()); 
      window.pack(); 
      window.setVisible(true); 
     } 
    }); 
} 
+0

このルールに気づいていなかったので、私はスイングが新しいので、助けていただきありがとうございます。 – Christian

+1

あなたを助けてくれることを嬉しく思います。投稿するにはhttp://sscce.org/ +1 – mKorbel

関連する問題