java - JLabel setForeground 在 SwingWorker 中不起作用
Posted
技术标签:
【中文标题】java - JLabel setForeground 在 SwingWorker 中不起作用【英文标题】:java - JLabel setForeground doesn't work in SwingWorker 【发布时间】:2019-08-10 23:43:10 【问题描述】:我需要每 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 中的方法在不同的线程中运行。检查文档以了解它是如何完成的 【参考方案1】:它们不一样。在第一种情况下,您执行以下操作:
您将前景色更改为蓝色 你等一秒钟 你把颜色改成红色 别等了 你把颜色改成蓝色 你等一秒钟 ...无穷无尽【讨论】:
以上是关于java - JLabel setForeground 在 SwingWorker 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
为啥这个 JLabel 不在这个 Java 应用程序的中心?