Return 来自 InvokeAndWait 的值

Return Value from InvokeAndWait

我有一个 Java GUI 应用程序,其中的视图应该提供一个功能,例如要求用户选择路径。在用户选择路径(或者如果用户取消)之前,该功能应该是阻塞的。

由于在 EDT 线程的上下文中未调用该函数,因此我使用了 invokeAndWait。它看起来像这样,其中路径是视图的私有成员:

private String path;

public String getPath(String defaultPath)
{
    try{
        SwingUtilities.invokeAndWait( () -> {
             // Ask here the user for the path
             path = new PathSelector(defaultPath).getPath();
        }
    } catch (InvocationTargetException e) {
        return "";
    } catch (InterruptedException e) {
        return "";
    }
    return path;
}

我的问题是如何将在 EDT 上下文中选择的路径传递给最初调用的函数,并 return 它在那里。以下行已被阻止:

path = new PathSelector(defaultPath).getPath();

目前我用私有成员path解决了它,但实际上我不喜欢这个解决方案,因为路径更像是一个临时变量,实际上与[=30=无关] 本身。为此寻找另一种解决方案,我遇到了 SwingWorker 但我无法弄清楚如何解决我的 'problem'.

另一个想法可能是创建一个对象,它有一个字符串作为成员,getter 和 setter 来设置这个字符串并传递这个对象的引用,它可以设置字符串成员EDT 并在 getPath 函数中将其取回 return。

有没有更流畅的解决方案?

由于没有人想出另一种解决方案,我自己找到的最好的解决方案是:我创建了一个简单的对象,其中包含指向 return 的字符串。所以我在两个任务上下文中都有一个我可以使用的参考。有人对改进此解决方案有一些意见,我对此持开放态度。

这是保存字符串的 class。

public class StringCover {
  private String string = "";

  public String getString() {
    return string;
  }

  public void setString(String string) {
    this.string = string;
  }

}

这是上述解决方案的代码。

public String getPath(String defaultPath)
{
    StringCover stringCover = new StringCover();
    try{
        SwingUtilities.invokeAndWait( () -> {
             // Ask here the user for the path
             stringCover.setString(new PathSelector(defaultPath).getPath());
        }
    } catch (InvocationTargetException e) {
        stringCover.setString("");
    } catch (InterruptedException e) {
        stringCover.setString("");
    }
    return stringCover.getString();
}