Swing - JButton 文本不响应 setText()
Swing - JButton text does not respond to setText()
我在创建的 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 上的任何其他组件,就好像整个线程都被阻塞了一样
答案是主线程由于 swing 主线程的单一性而被阻塞。
"The Swing single-thread rule: Swing components and models should be
created, modified, and queried only from the event-dispatching
thread."
—Java 并发实践。
我已经更新了我的代码以适应 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 让我走上了正确的方向。
我在创建的 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 上的任何其他组件,就好像整个线程都被阻塞了一样
答案是主线程由于 swing 主线程的单一性而被阻塞。
"The Swing single-thread rule: Swing components and models should be created, modified, and queried only from the event-dispatching thread."
—Java 并发实践。
我已经更新了我的代码以适应 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 让我走上了正确的方向。