Swing - JButton文本不响应setText()

时间:2016-07-13 19:30:31

标签: java swing awt

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

1 个答案:

答案 0 :(得分:4)

答案是由于swing主线的奇异性,主线程被阻塞。

  

" Swing单线程规则:Swing组件和模型应该是   仅从事件派发中创建,修改和查询   。螺纹"

-Java Concurrency in Practice。

我更新了我的代码以适应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让我朝着正确的方向前进。