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。我遇到了同样的问题。
我有一个 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。我遇到了同样的问题。