我一直在使用以下方法来创造的部件和返回值从摆向/从外EDT.例如,以下的方法可以扩展到 JFrame, ,创建一个 JPanel 和增加它的父母 JFrame:

public JPanel threadSafeAddPanel() {

    final JPanel[] jPanel = new JPanel[1];

    try {
        EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                jPanel[0] = new JPanel();
                add(jPanel[0]);
            }
        });
    } catch (InterruptedException ex) {
    } catch (InvocationTargetException ex) {
    }

    return jPanel[0];
}

本地的1-长阵列是用于转让的"结果"从内部 Runnable, ,这是援引在EDT.嗯,它看起来"一位"哈克,所以我的问题:

  1. 这有意义吗?是别人做这样的事情?
  2. 是的1-长列一个很好的方式转移的结果?
  3. 是有一个更简单的方式做到这一点?
有帮助吗?

解决方案

  • 吞咽异常甚至没有记录: 坏! -你会恨自己的时候你看到什么样的后2小时的错误-狩猎
  • 没有,列不是一个好的方式;一方面,它没有提供任何容易的方法调用代码等待EDT线执行 Runnable 之前获取的结果
  • 还有一类设计的明确用于这样的事情: SwingWorker

其他提示

虽然该方法可能是有意义在某些情况下,这将是无用的大部分时间。

其原因是,所创造的大多数(如果不是全部)的部件将总是发生在从美国东部,由一个用户的行动(菜单项或钮扣点击)它们总是从执行的EDT.

在这种情况下您有庞大的工作之前要执行的创造你的面板,你不想阻止美国东部,然后你应该,因为建议由其他人使用SwingWorker或摆动框架,该框架提供支持长期任务(一般基于SwingWorker境内无论如何,但不一定是).

关于你的问题2的,不幸的是你没有很多方法可以做到的是:

  • 使用1项列为你没有,这的 最简单也是最丑陋的解决方案
  • 创建一个ItemHolder类(见 下文),并几乎一样, 需要一点更多的工作, 吸尘器在我的意见
  • 最后,使用java。工具.并发 设施(未来和可调用);这将是cleaniest我认为, 但也需要最大的努力

在这里,简化,ItemHolder类:

public class ItemHolder<T> {
    public void set(T item) {...}
    public T get() {...}
    private T item;
}
  1. a)有意义的。b)不,我知道的。
  2. 如有)。
  3. 创建JPanel外 invokeAndWait 呼叫

//加入这一行安抚。

public JPanel threadSafeAddPanel() {
    final JPanel jPanel = new JPanel();
    try {
        EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                add(jPanel);
            }
        });
    } catch (InterruptedException ex) {
    } catch (InvocationTargetException ex) {
    }
    return jPanel;
}

你可以很容易地查看如果该当前线的是本条和随后执行正确和更简单地说,在这种情况。作为最终使用列为获得回报的价值,这是最简单的方法时必须使用匿名内部流的喜欢这个。

public JPanel threadSafeAddPanel() throws InterruptedException, 
        InvocationTargetException {
    if (EventQueue.isDispatchThread()) {
        JPanel panel = new JPanel();
        add(panel);

        return panel; 
    } else {
        final JPanel[] jPanel = new JPanel[1];
        EventQueue.invokeAndWait(new Runnable() {
            public void run() {
                jPanel[0] = new JPanel();
                add(jPanel[0]);
            }
        });

        return jPanel[0];
    }
}
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top