Swing - UI 的重新验证没有发生

Swing - revalidate of UI not happening

我有一个 JButton 和一个 JLabel。编写代码以便当用户单击按钮时,执行的操作会更改 JLabel 的文本并开始执行某些操作。然而,实际上,Label 文本在完成所完成的工作之前不会更改。

这是按钮操作中的代码

lbl.setText("Doing");
revalidate();
DoStuff();

在方法 DoStuff returns 之前,标签的文本不会更改。我知道 revalidate 只是安排了对 paint 的调用,所以我认为这是因为绘制线程从未获得切片来更改文本。

我该如何解决这个问题?

这是一个重现程序。我有一个模拟相同行为的 while(true); 而不是 DoStuff()。如果你 运行 这个程序,你必须杀死它才能退出。

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Util1
{
    public static void main(String[] args)
    {
        new Util1();
    }

    public Util1()
    {
        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new ExamplePane());

                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true); 
            }
        });
    }


    protected class ExamplePane extends JPanel 
    {
        public ExamplePane() 
        {
            final JPanel panel = new JPanel(new GridBagLayout());

            JButton btn = new JButton("Do Stuff");
            final JLabel lbl = new JLabel("Status");
            add(btn);
            add(lbl);

            btn.addActionListener(new ActionListener() 
            {
                public void actionPerformed(ActionEvent ae) 
                {
                    lbl.setText("Doing");
                    revalidate();
                    while(true);
                }
            });

        }            
    }        
}

问题是,public void actionPerformed(ActionEvent ae) 方法中的操作在 Swing 线程中执行。在执行所有操作之前,不会显示更改。例如,您可以在另一个线程中执行 doStaff 方法。 有关详细信息,请参阅 this topic。我遇到了同样的问题。