2011-01-25 3 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

스폰 된 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 –

+0

시도했지만 도움이되지 않았 음 – Damir

2

나는 당신의 restartSSH() 방법은 event dispatch thread를 차단하고 용의자. 한 가지 방법은 example에서 제안 된대로 SwingWorker을 사용하는 것입니다. 이렇게하면 재시작 프로세스의 진행 상태를 표시하고 완료되면 레이블을 적절하게 설정할 수 있습니다.