我在创建的JButton中添加了一个操作,以下是我的代码
private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {
txtResult.setText("");
myButton.setText("Working ...");
myButton.setEnabled(false);
myButton.repaint();
System.out.println("Doing Action ...");
SwingUtilities.invokeLater(new Runnable() {
public void run() { // some code inside that is memory intensive
}
});
segmentButton.setText("Original Text");
segmentButton.setEnabled(true);
}
虽然我能够看到系统,但我的组件根本没有得到更新,更多的是我无法更新JFrame上的任何其他组件,就像整个线程被阻止一样
答案 0 :(得分:4)
答案是由于swing主线的奇异性,主线程被阻塞。
" Swing单线程规则:Swing组件和模型应该是 仅从事件派发中创建,修改和查询 。螺纹"
-Java Concurrency in Practice。
我更新了我的代码以适应SwingWorker中的阻止代码,如下所述
private void myButtonActionPerformed(java.awt.event.ActionEvent evt) {
txtResult.setText("");
myButton.setText("Working ...");
myButton.setEnabled(false);
myButton.repaint();
System.out.println("Doing Action ...");
SwingWorker worker = new SwingWorker() {
@Override
protected Object doInBackground() throws Exception {
//Memory intensive code
}
@Override
protected void done() {
segmentButton.setText("Original Text");
segmentButton.setEnabled(true);
super.done(); //To change body of generated methods, choose Tools | Templates.
}
};
worker.execute();
}
感谢@copeg让我朝着正确的方向前进。