Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 从InvokeAndWait返回值_Java_Swing_Event Dispatch Thread_Invokeandwait - Fatal编程技术网

Java 从InvokeAndWait返回值

Java 从InvokeAndWait返回值,java,swing,event-dispatch-thread,invokeandwait,Java,Swing,Event Dispatch Thread,Invokeandwait,我有一个JavaGUI应用程序,其中的视图应该提供一个函数,要求用户选择一个路径。在用户选择路径(或者如果用户取消)之前,函数应一直处于阻塞状态 由于函数不是在EDT线程的上下文中调用的,所以我使用invokeAndWait。它看起来像这样,其中path是视图的私有成员: private String path; public String getPath(String defaultPath) { try{ SwingUtilities.invokeAndWait(

我有一个JavaGUI应用程序,其中的视图应该提供一个函数,要求用户选择一个路径。在用户选择路径(或者如果用户取消)之前,函数应一直处于阻塞状态

由于函数不是在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
解决了这个问题,但实际上我不喜欢这个解决方案,因为path更像是一个临时变量,实际上与类本身无关。在寻找另一个解决方案时,我遇到了
SwingWorker
,但我不知道如何解决我的“问题”

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


有人有更平滑的解决方案吗?

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

这是保存字符串的类

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();
}

我想你只是想要一个模态对话框。我的想法和@JBNizet一模一样。例如,JOptionPane就非常适合这样做。了解JOptionPanes可以容纳复杂的GUI,包括装满组件的JPanel,如果需要,或者如果您不想在这种情况下使用它们,那么模态JDialog将是完美的。
//在这里询问用户路径
如果您指的是文件路径,那么使用
JFileChooser
(在@JBNizet建议的模式对话框中显示)。抱歉,我可能太不清楚我的问题是什么。问题不是如何实现gui本身,获取路径的函数已经被阻塞。我的问题是如何将字符串变量传递回getPath函数以返回它。我使用了一个成员变量“path”,但由于该变量更像是一个临时变量,我不喜欢使用它将其设置为成员变量。