0

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

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

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 上下文中选择的路径传递给最初调用的函数并将其返回到那里。以下行已经阻塞:

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

目前我用 private member 解决了它path,但实际上我不喜欢这个解决方案,因为 path 更像是一个临时变量,实际上与类本身无关。在为此寻找另一种解决方案时,我遇到了,SwingWorker但我不知道如何解决我的“问题”。

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

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

4

1 回答 1

0

由于没有人想出另一种解决方案,我自己能找到的最好的解决方案是:我创建了一个包含要返回的字符串的简单对象。所以我在两个任务上下文中都有一个可以使用的参考。我有人有一些意见来改进这个解决方案,我愿意接受。

这是保存字符串的类。

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();
}
于 2015-11-07T17:41:12.703 回答