【问题标题】:java - JLabel setForeground doesn't work in SwingWorkerjava - JLabel setForeground 在 SwingWorker 中不起作用
【发布时间】:2023-03-11 15:05:01
【问题描述】:

我需要每 1 秒在蓝色和红色之间更改 JLabel 颜色,我必须使用 SwingWorker 来完成这项工作,但我只能更改一次颜色,然后它就会停止执行任何操作。

SwingWorker 子类:

public class NewClass extends SwingWorker {
    private JLabel label;

    public NewClass(JLabel label) {
        this.label = label;
    }
    @Override
    protected Object doInBackground() throws Exception {
        while(true) {
            label.setForeground(Color.BLUE);
            try {
                sleep(1000);
            } catch (Exception ex) {
                 ex.printStackTrace();
            }

            label.setForeground(Color.RED);  
        }
    } 

    void changeColor() {
         Color c = label.getForeground();

         if(c == Color.RED)
            label.setForeground(Color.BLUE);
         else
            label.setForeground(Color.RED);
    }
}

public class NewJFrame extends javax.swing.JFrame {

    public NewJFrame() {
        initComponents();

        NewClass g = new NewClass(label);
        g.execute();


    }

    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }


    private javax.swing.JLabel label;

}

但如果我将 doInBackground 更改为使用我的 changeColor 方法,它运行良好:

protected Object doInBackground() throws Exception {
        while(true) {
            changeColor();
            try {
                sleep(1000);
            } catch (Exception ex) {
                 ex.printStackTrace();
            }  
        }
}

我不知道为什么它不能在前者中运行,我认为这两种方式是一样的。

【问题讨论】:

  • 附加说明:您正在从后台线程而不是 EDT(事件调度线程)更新 GUI。这不能保证有效。
  • @JustanotherJavaprogrammer 我认为使用 SwingWorker 可以像在 EDT 线程中更新它们一样更新 Swing 组件
  • Swingworker 中的方法在不同的线程中运行。检查文档以了解它是如何完成的

标签: java multithreading swing sleep


【解决方案1】:

它们不一样。在第一种情况下,您执行以下操作:

  • 您将前景色更改为蓝色
  • 你等一秒钟
  • 你把颜色改成红色
  • 别等了
  • 你把颜色改成蓝色
  • 你等一秒钟
  • ...无穷无尽

【讨论】:

    猜你喜欢
    • 2017-10-19
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2014-05-14
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    相关资源
    最近更新 更多