Java Swing-JButton文本不响应setText()

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);

我在创建的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主线程的独特性质,主线程被阻塞了

“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好的,谢谢你的建议