0

我是java的初学者,不幸的是我被困在这个问题上。在代码中:

新JFrame.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;
}

新类.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

您正在创建一个永远不会显示NewJFrame的新实例:NewClass

new NewJFrame().showText();

您需要将可见实例传递NewClass给它才能更新。

但是,最好使用javax.swing.Timer而不是java.util.Timer与 Swing 组件交互。从如何使用摆动计时器

一般来说,我们建议使用 Swing 计时器而不是通用计时器来处理与 GUI 相关的任务,因为 Swing 计时器都共享相同的、预先存在的计时器线程,并且与 GUI 相关的任务会自动在事件调度线程上执行。

另请参阅:Swing 中的并发性

于 2013-02-17T22:54:55.937 回答
3

JLabel永远不会添加到任何容器中。为什么会出现?

作为一般建议,不要扩展框架,只需保留参考,如@Reimeus 所述,使用 Swing Timer

于 2013-02-17T23:03:06.147 回答
0

repaint()设置文本后立即尝试添加。

更改屏幕上某些内容的外观后,您必须始终重新绘制框架。

jLabel1.setText("in show()");    //it does not work
repaint();                       //now it works
System.out.println("in show()"); //it works
于 2013-02-17T22:52:54.370 回答