0
我有一個JButton
和一個JLabel
。編寫代碼的目的是當用戶點擊按鈕時,執行的操作會更改JLabel
的文本並開始執行某些操作。但是,實際上,標籤文本不會改變,直到正在完成的東西完成。Swing - 不再發生UI的重新驗證
這是按鈕動作
lbl.setText("Doing");
revalidate();
DoStuff();
代碼標籤的文本不會改變,直到方法DoStuff
回報。我知道revalidate
只是安排電話paint
,所以我認爲這是因爲繪製線程從來沒有得到一個切片來改變文本。
我該如何解決這個問題?
這是一個repro程序。而不是DoStuff()
,我有一個while(true);
模擬相同的行爲。如果你運行這個程序,你必須殺死它才能退出。
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);
}
});
}
}
}