首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用invokeAndWait从Swing返回值

使用invokeAndWait从Swing返回值
EN

Stack Overflow用户
提问于 2010-03-08 13:34:57
回答 4查看 2.4K关注 0票数 3

我一直在使用以下方法创建组件,并将值从Swing返回到EDT之外。例如,下面的方法可以是对JFrame的扩展,以创建JPanel并将其添加到父JFrame

代码语言:javascript
复制
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. 是传递结果的好方法吗?
  3. 有更简单的方法吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-08 13:45:08

SwingWorker

  • 在没有记录异常的情况下吞咽异常:糟糕!--当您在经过2小时的bug搜索

  • no之后遇到这样的情况时,您会痛恨自己;数组不是一个好方法;首先,它提供了一个不容易的方法,让调用代码在获取结果

  • 之前等待EDT线程执行Runnable --有一个类是为这类事情明确设计的:
票数 1
EN

Stack Overflow用户

发布于 2010-03-09 00:25:40

虽然这种方法在某些情况下可能是有意义的,但它在大多数情况下都是无用的。

原因是大部分(如果不是全部)组件的创建总是从EDT中发生,这是用户操作(单击菜单项或按钮)的结果,这些操作总是从EDT执行的。

如果在创建面板之前有大量工作要执行,并且不想阻止EDT,那么您应该按照其他人的建议,使用SwingWorker或Swing框架来支持长任务(通常是基于内部的SwingWorker,但不一定是这样)。

关于你的第二个问题,不幸的是,你没有很多方法可以做到这一点:

solution

  • Create
  • 和您一样使用一个1项数组,这是最简单但也最丑的ItemHolder类(参见下面),它几乎相同,需要更多的工作,而且更干净,在我看来,
  • Last,使用java.util.concurrent工具(未来和可调用);这将是最干净的,但也需要最大的努力

下面是简化的ItemHolder类:

代码语言:javascript
复制
public class ItemHolder<T> {
    public void set(T item) {...}
    public T get() {...}
    private T item;
}
票数 3
EN

Stack Overflow用户

发布于 2010-03-08 13:40:40

  1. a)这是有道理的。(B)据我所知,
  2. 没有任何情况好。
  3. invokeAndWait call

之外创建JPanel

//这一行加起来是为了平抑下来

代码语言:javascript
复制
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;
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2401605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档