【问题标题】:In actionPerformed repaint doesn't work with new Thread在 actionPerformed 重绘不适用于新线程
【发布时间】:2024-01-09 10:24:01
【问题描述】:

按下按钮后,actionPerformed 被调用。像这样开始一个新的Thread

public void actionPerformed(ActionEvent evt) {
    try {
        Runnable r = new Runnable() {
            public void run() {
                try {
                    mylabel.setText("new text");
                    mylabel.revalidate();
                    mylabel.repaint();
                } catch (Exception x) {
                    x.printStackTrace();
                }
            }
        };

        Thread thread = new Thread(r);
        thread.start();
        MyFunction();

    // ...

myLabel 之后,字符串new text 不会出现,只是在actionPerformed 运行之后。

【问题讨论】:

    标签: java multithreading swing user-interface label


    【解决方案1】:

    您应该在事件调度线程 (EDT) 中运行与 GUI 相关的代码。不要创建另一个线程。

    public void actionPerformed(ActionEvent evt) {
        try {
            SwingUtilities.invokeLater(
                new Runnable() {
                    ...
    

    如果actionPerformed 是侦听器回调,它已经在 EDT 上运行。创建另一个 Runnable 如果回调需要很长时间执行,否则它会“减慢”GUI。

    如果MyFunction() 方法与 GUI 重绘或类似的东西无关, 在另一个线程上运行它,特别是如果它是资源密集型的。

    【讨论】: