【问题标题】:Swing - JButton text does not respond to setText()Swing - JButton 文本不响应 setText()
【发布时间】:2016-07-14 05:07:54
【问题描述】:

我在创建的 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 上的任何其他组件,就好像整个线程被阻塞了一样

【问题讨论】:

  • ...as if the whole thread is blocked 是。 Swing 是单线程的——使用 SwingUtilities 在 EDT 上放置一些密集的代码会阻止 Swing 更新。使用单独的线程或 SwingWorker
  • 谢谢@copeg!我根据您的建议添加了一个答案并提到了您

标签: java swing awt


【解决方案1】:

答案是主线程由于摆动主线程的奇异性质而被阻塞。

《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 为我指明了正确的方向。

【讨论】:

  • @AndrewThompson 完成,感谢您的建议
猜你喜欢
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-27
相关资源
最近更新 更多