gpt4 book ai didi

java - 使用 invokeAndWait 从 Swing 返回值

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:29:03 27 4
gpt4 key购买 nike

我一直在使用以下方法创建组件并从 Swing 向/从 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. 有更简单的方法吗?

最佳答案

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

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

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

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

  • 像你一样使用 1-item 数组,那是最简单但也是最丑陋的解决方案
  • 创建一个 ItemHolder 类(参见下面)几乎相同,需要更多的工作,并且是在我看来更干净
  • 最后,使用 java.util.concurrent设施( future 和可调用);那将是我认为最干净的,但也需要最大的努力

这是简化的 ItemHolder 类:

public class ItemHolder<T> {
public void set(T item) {...}
public T get() {...}
private T item;
}

关于java - 使用 invokeAndWait 从 Swing 返回值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2401605/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com