2013-02-17 3 views
0

저는 초보자입니다. 불행히도이 문제에 봉착했습니다.자바 : setText() 및 스레드

NewJFrame.java :

public class NewJFrame extends JFrame { 

    public void showText() { 
     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       jLabel1.setText("in show()"); //it does not work 
       System.out.println("in show()"); //it works 
      } 
     }); 
    } 

    public NewJFrame() { 
     initComponents(); 
     jLabel1.setText("start"); //it works 
    } 

    public static void main(String args[]) { 
     Timer timer = new Timer(); 
     timer.schedule(new NewClass(), 1000, 2000); 

     SwingUtilities.invokeLater(new Runnable() { 
      public void run() { 
       new NewJFrame().setVisible(true); 
      } 
     }); 
    } 
    private javax.swing.JLabel jLabel1; 
} 

NewClass.java : 코드에서 호출 될 때

package newpackage; 

import java.util.TimerTask; 

class NewClass extends TimerTask { 

    public void run() { 
     System.out.println("in NewClass.run()"); //it works 
     new NewJFrame().showText(); 
    } 
} 

나는의 setText가 jLabel1를 설정하지 않는다는 사실에 문제가 타이머 스레드에서. invokeLater()를 사용하여 문제를 해결하려고했지만 여전히 작동하지 않습니다. 도움 주셔서 감사합니다.

+0

더 나은 도움을 받으려면 [SSCCE] (http://sscce.org/)를 게시하십시오. –

+1

이 경우 java.util.TimerTask를 사용하면 Swing 단일'Thread' 규칙을 위반하게됩니다 - EDT 외부에서 UI 구성 요소를 생성하거나 수정해서는 안됩니다. '; 이것은 당신이'initComponents()에 누락 된 코드에서 거짓말을 수도'java.swing.Timer' – MadProgrammer

+0

이에 대한 대답의 많은 사용을 권장하고있다 방법입니다. 앞에서 언급 한 것처럼 '더 빨리 도움을 받으려면 [SSCCE] (http://sscce.org/)'를 게시하십시오. –

답변

0

텍스트를 설정 한 직후에 repaint()을 추가하십시오.

화면에서 모양을 변경 한 후에는 항상 프레임을 다시 그려야합니다.

jLabel1.setText("in show()"); //it does not work 
repaint();      //now it works 
System.out.println("in show()"); //it works 
+2

'JLabel # setText()'는'repaint()'가 필요 없다고 생각합니다. 확인을 위해 Swing 괴짜를 기다립니다. –

+1

@ Eng.Fouad : 텍스트는 바운드 속성입니다. 만약'칠() 앤드류의 의견이 옳았다 @', 필요합니다. – trashgod

3

당신은 표시 결코 극복하는 NewClassNewJFrame의 새로운 인스턴스를 만들 :

new NewJFrame().showText(); 

당신은 그것을 업데이트 할 수 있도록 NewClass에 보이는 인스턴스를 전달해야합니다.

그러나, 더 나은 스윙 구성 요소와 상호 작용하는 javax.swing.Timer보다는 java.util.Timer를 사용합니다. How to Use Swing Timers에서 : 스윙 타이머 모두가 공유 같은, 기존의 타이머 스레드와 GUI 관련 작업이 자동으로 실행하기 때문에 일반적으로

, 우리는 GUI 관련 작업을위한 스윙 타이머보다는 범용 타이머를 사용하는 것이 좋습니다 이벤트 발송 쓰레드.

항목 : Concurrency in Swing

3

JLabel는 컨테이너에 추가되지 않습니다. 왜 나타나겠습니까?

는 일반적인 조언으로, 프레임을 연장하지 않는, 단순히 참조를 유지하고 @Reimeus에서 언급 한 바와 같이, 스윙 Timer를 사용합니다.