在下一个代码中应该有一个错误/遗漏,但我看不到大部分是因为我从未使用过线程。有人可以找到我所缺少的吗?

import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Timer;
import java.util.TimerTask;

import javax.swing.JDialog;
import javax.swing.JLabel;

public class JavaSwingTest extends JDialog {
    private JLabel m_countLabel;

    private Timer m_timer = new Timer();

    private class IncrementCountTask extends TimerTask {
        @Override
        public void run() {
            m_countLabel.setText(Long.toString(System.currentTimeMillis()
/ 1000));
        }
    }

    private JavaSwingTest() {
        createUI();

        m_timer.schedule(new IncrementCountTask(), 1000, 1000);
    }

    private void createUI() {
        Button button1 = new Button("Action1");
        button1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent arg0) {
                doLongOperation();
            }

        });
        add(button1, BorderLayout.NORTH);

        m_countLabel = new JLabel(Long.toString(System.currentTimeMillis()
/ 1000));
        add(m_countLabel, BorderLayout.CENTER);
    }

    /**
     * Simulates an operation that takes time to complete.
     */
    private void doLongOperation() {
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            // ignored for this test
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        new JavaSwingTest().setVisible(true);
    }
}

最佳答案

像大多数UI工具包一样,Swing也不是线程安全的。您的setText()调用应转发到事件线程。

要从计时器线程启动GUI工作,请使用SwingUtilities .invokeLater()或invokeAndWait()。

10-06 01:01