0

私はJavaの初心者ですが、残念ながらこの問題に悩まされていました。コード内:

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() を使用して問題を解決しようとしましたが、まだ機能しません。ご協力いただきありがとうございます。

4

3 に答える 3

3

JLabelどのコンテナにも追加されません。なぜそれが現れるのでしょうか?

一般的なアドバイスとして、フレームを拡張せず、単に参照を保持し、@ Reimeusが述べているように、Swingを使用しTimerます。

于 2013-02-17T23:03:06.147 に答える
3

決して表示されないNewJFrame新しいインスタンスを作成しています:NewClass

new NewJFrame().showText();

NewClass更新するには、可視インスタンスを に渡す必要があります。

ただし、Swing コンポーネントとやり取りするjavax.swing.Timerよりも、使用する方が適切です。スイングタイマーの使い方java.util.Timerから:

Swing タイマーはすべて同じ既存のタイマー スレッドを共有し、GUI 関連のタスクはイベント ディスパッチ スレッドで自動的に実行されるため、一般に、GUI 関連のタスクには汎用タイマーではなく Swing タイマーを使用することをお勧めします。

参照: Swing での同時実行

于 2013-02-17T22:54:55.937 に答える