2013-02-17 2 views
0

Я новичок в java и, к сожалению, я застрял в этой проблеме. В коде:Java: 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' в этом случае будет нарушать одно правило' Thread' Swing - вы никогда не должны создавать или изменять компонент UI за пределами EDT. Таким образом, вам рекомендуется использовать 'java.swing.Timer' – MadProgrammer

+0

. Большая часть ответа на этот вопрос может заключаться в недостающем коде в' initComponents(); '. Как я уже упоминал ранее, «для лучшей помощи, скорее, опубликуйте [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()'. Подождем Свинг-гиков для подтверждения :) –

+1

@ Eng.Fouad: текст является связанным свойством; если требуется 'repaint()', комментарий Andrew был прав. – trashgod

3

Вы создаете новый экземпляр NewJFrame в NewClass, который не получает отображаться никогда:

new NewJFrame().showText(); 

Вы должны пройти видимую экземпляр NewClass для его обновления.

Однако лучше использовать javax.swing.Timer, а не java.util.Timer для взаимодействия с компонентами Swing. Из How to Use Swing Timers:

В целом, мы рекомендуем использовать Swing-таймеры, а не таймеры общего назначения для решения задач GUI связанных, потому что свинг таймеры одни и те же, ранее существовавшая нити таймера и задачи GUI связанные автоматически выполняются поток событий.

Смотрите также: Concurrency in Swing

3

JLabel никогда не добавляется в любой контейнер. Почему это должно появиться?

Как общий совет, не расширяйте рамку, просто держите ссылку и, как упоминалось @Reimeus, используйте Swing Timer.