Java Swing-JButton文本不响应setText()
我在创建的JButton中添加了一个操作,下面是我的代码Java Swing-JButton文本不响应setText(),java,swing,awt,Java,Swing,Awt,我在创建的JButton中添加了一个操作,下面是我的代码 private void myButtonActionPerformed(java.awt.event.ActionEvent evt) { txtResult.setText(""); myButton.setText("Working ..."); myButton.setEnabled(false);
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主线程的独特性质,主线程被阻塞了 “Swing单线程规则:Swing组件和模型应 仅从事件分派中创建、修改和查询 线程。” -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让我走上了正确的方向。答案是,由于swing主线程的特殊性质,主线程被阻塞 “Swing单线程规则:Swing组件和模型应 仅从事件分派中创建、修改和查询 线程。” -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帮我找到了正确的方向。
…就好像整个线程都被阻塞了一样。Swing是单线程的-使用SwingUtilities在EDT上放置一些密集的代码将阻止Swing的更新。使用单独的线程或SwingworkerTanks@copeg!我根据您的建议添加了一个答案,并提到您,…就好像整个线程都被阻塞了一样。Swing是单线程的-使用SwingUtilities在EDT上放置一些密集的代码将阻止Swing的更新。使用单独的线程或SwingworkerTanks@copeg!我根据你的建议补充了一个答案,并提到you@AndrewThompson好的,谢谢你的邀请advice@AndrewThompson好的,谢谢你的建议