2016-07-13 9 views
0

私は、次の、作成のJButtonにアクションを追加したが、私はシステムを見ることができていますが、私のコンポーネントが取得されていないスイング - JButtonのテキストは(のsetTextに応答しない)

private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {            
    txtResult.setText(""); 
    myButton.setText("Working ..."); 
    myButton.setEnabled(false); 
    myButton.repaint(); 
    System.out.println("Doing Action ..."); 
    SwingUtilities.invokeLater(new Runnable() { 
     public void run() { // some code inside that is memory intensive 
     } 
    }); 
    segmentButton.setText("Original Text"); 
    segmentButton.setEnabled(true); 
} 

私のコードですJFrame上の他のコンポーネントを、スレッド全体がブロックされているかのように更新することができません。

+4

'...スレッド全体がブロックされているかのように 'です。 Swingはシングルスレッドです - SwingUtilitiesを使用してEDTに集中的なコードを配置すると、Swingの更新がブロックされます。別のスレッドまたはSwingWorkerを使用してください – copeg

+0

Thanks @copeg!あなたのアドバイスに基づいて回答を追加しました。 – WiredCoder

答えて

3

答えは、メインスレッドがスイングメインスレッドの特異性のためにブロックされるというものでした。

「Swingのシングルスレッドのルール:Swingコンポーネントとモデルは、作成、変更、およびイベント・ディスパッチ スレッドからのみ照会 でなければなりません。」

-Java同時実行性

私は正しい方向に私を置くため@copeg

private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {            
txtResult.setText(""); 
myButton.setText("Working ..."); 
myButton.setEnabled(false); 
myButton.repaint(); 
System.out.println("Doing Action ..."); 
    SwingWorker worker = new SwingWorker() { 
     @Override 
     protected Object doInBackground() throws Exception { 
      //Memory intensive code 
     } 

     @Override 
     protected void done() { 
      segmentButton.setText("Original Text"); 
      segmentButton.setEnabled(true); 
      super.done(); //To change body of generated methods, choose Tools | Templates. 
     } 
    }; 
    worker.execute(); 
} 

おかげで、以下のようにSwingWorkerの中にブロッカーコードに対応するために自分のコードを更新しました。

+0

[回答を受け入れてください](http://meta.stackexchange.com/a/5235/155831)。そうすることで、人々は後でそれを見つけるのに役立ちます。 –

関連する問題