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 让我走上了正确的方向。