在actionPerformed重绘不适用于新线程

时间:2014-04-08 14:45:37

标签: java multithreading swing user-interface label

按下按钮后,调用actionPerformed。像这样开始一个新的Thread

public void actionPerformed(ActionEvent evt) {
    try {
        Runnable r = new Runnable() {
            public void run() {
                try {
                    mylabel.setText("new text");
                    mylabel.revalidate();
                    mylabel.repaint();
                } catch (Exception x) {
                    x.printStackTrace();
                }
            }
        };

        Thread thread = new Thread(r);
        thread.start();
        MyFunction();

    // ...

myLabel之后,new text之前的字符串actionPerformed没有出现。

1 个答案:

答案 0 :(得分:0)

您应该在Event Dispatch Thread(EDT)中运行GUI相关代码。不要创建另一个线程。

public void actionPerformed(ActionEvent evt) {
    try {
        SwingUtilities.invokeLater(
            new Runnable() {
                ...

如果actionPerformed是侦听器回调,则它已在EDT上运行。创建另一个 Runnable如果回调需要很长时间才能执行,或者它会“减慢”GUI。

如果MyFunction()方法与GUI重绘或类似的方法无关, 在另一个线程上运行它,特别是如果它是资源密集的。