从InvokeAndWait返回值

时间:2015-10-25 14:12:20

标签: java swing event-dispatch-thread invokeandwait

我有一个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();

目前我用私人成员path解决了这个问题,但实际上我并不喜欢这个解决方案,因为路径更像是一个临时变量,实际上与类本身无关。为此寻找另一个解决方案,我遇到了SwingWorker,但我无法弄清楚如何解决这个问题'。

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

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

1 个答案:

答案 0 :(得分:0)

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

这是保存字符串的类。

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'CREATE TABLE IF NOT EXISTS parts (part_name TEXT NOT NULL, remaining_amt INT NOT' at line 1

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

public class StringCover {
  private String string = "";

  public String getString() {
    return string;
  }

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

}