2011-01-25 14 views
3

一部は、このJLabelのは(私は、機能ラベルに入力する前に、私の機能の

jLabel2.setBackground(Color.YELLOW); 
jLabel2.setText("Status : Idle"); 

boolean ok=cpu21.RestartSSH(); 

if(ok){ 
    jLabel2.setBackground(Color.GREEN); 
    jLabel2.setText("Status : Run");  
} 

似た色をバックに変更緑と実行されますが、私は機能に来るとき、それは黄色に色をchabgeしませんしません関数RestartSSHは5〜6秒実行していますが、その間ラベルは色とキャプチャを変更しません)。どこで絵を間違えるの?

答えて

11
  • あなたがその背景色を設定することができますので、あなたのJLabelを不透明にします。
  • RestartSSHを別のスレッドで実行するか、GUIがイベントに応答しません。

例:

final JLabel jLabel2 = new JLabel("HELLO"); 
jLabel2.setOpaque(true); 
jLabel2.setBackground(Color.YELLOW); 
jLabel2.setText("Status : Idle"); 

//perform SSH in a separate thread 
Thread sshThread = new Thread(){ 
    public void run(){ 
     boolean ok=cpu21.RestartSSH(); 
     if(ok){ 
      //update the GUI in the event dispatch thread 
      SwingUtilities.invokeLater(new Runnable() { 
       public void run() { 
        jLabel2.setBackground(Color.GREEN); 
        jLabel2.setText("Status : Run"); 
       } 
      }); 
     } 
    } 
}; 
sshThread.start(); 

(更新:SwingUtilities.invokeLaterへの追加の呼び出し)

+2

SpingされたスレッドのUI呼び出しにSwingUtilities.invokeLater(..)を追加すると –

+0

+1です正しいアイデアですが、ここで提案されているように 'Thread'は' invokeLater() 'を使うべきですhttp://en.wikipedia.org/wiki/Continuation_passing_style#Continuations_as_objects – trashgod

5

JLabelsはデフォルトで不透明であるため、その背景はデフォルトで塗りつぶされません。試してみてください:

あなたは色を変更した後に再描画呼び出す必要があり
jLabel2.setOpaque(true); 

または多分:

jLabel2.repaint(); 
+1

* JLabelの背景がデフォルトで透明なので+1 +1 –

+0

私は試しましたが、助けになりません – Damir

2

私はあなたのrestartSSH()方法はevent dispatch threadをブロックしていると思われます。 1つの方法は、exampleで提案されているように、SwingWorkerを使用することです。これにより、再起動処理の進捗状況を表示し、完了したらラベルを適切に設定することができます。

関連する問題