2012-02-20 4 views
0

XMPP 서버에 연결 중입니다. 사용자의 현재 상태 (예 : "XMPP 서버에 연결 중", "인증 전달 중"등)을 사용자에게 알려 드리고 싶습니다. 자바에서 다음 코드를 사용합니다. 마지막 상태 인 "Successfully connected"를 보여줍니다.자바 스윙에서 jLabel을 새로 고치는 방법은 무엇입니까?

private void jLoginActionPerformed(java.awt.event.ActionEvent evt) { 
     Connection connection=new XMPPConnection("example.com"); 
     jStatusBar.setText("Connecting to XMPP Server ..."); 
     connection.connect(); 
     jStatusBar.setText("Passing authentication ..."); 
     connection.login(username, password); 
     jStatusBar.setText("Successfully connected."); 

} 

레이블을 새로 고치려면 어떻게해야하나요?

+0

* * 스윙 응용 프로그램에있는 코드 스 니핏은? 이벤트 처리기에있는 경우 다시 그리기 이벤트 처리를 담당하는 스레드에 있기 때문에 처음 두 이벤트는 표시되지 않습니다. –

+0

@BrianRoach. jButton의 클릭 이벤트 아래에 있습니다. 위의 코드 블록을 업데이트했습니다. – Bakhtiyor

답변

0

SwingWorker를 사용하여 EDT가 아닌 다른 스레드에서 로그인을 수행하고 SwingUtilities.invokeLater를 사용하여 EDT의 상태 표시 줄을 업데이트 할 수 있습니다. 구현 내용은 다음과 같습니다.

SwingWorker<Void, Void> loginTask = new SwingWorker<Void, Void>(){ 

     protected void doInBackground(){ 
      Connection connection=new XMPPConnection("example.com"); 
      message("Connecting to XMPP Server"); 
      connection.connect(); 
      message("Passing authentication ..."); 
      connection.login(username, password); 
      message("Successfully connected."); 
     } 

     private void message(final String text){ 
      SwingUtilities.invokeLater(new Runnable(){ 
       jStatusBar.setText(text); 
      }); 
     } 
    } 

loginTask.execute(); 
+0

<익명 gap.LoginForm $ 5>는 추상 클래스가 아니며 javax.swing.SwingWorker의 추상 메소드 doInBackground()를 재정의하지 않습니다. – Bakhtiyor

+0

-1 invokeLater를 사용하여 우회합니다. 중간 결과를 처리하기위한 의도 된 방법은 doInBackground에서 게시를 호출하고 실제 설정을 수행하는 프로세스를 구현하는 것입니다 (EDT에 있음을 보장합니다) – kleopatra