Java 从InvokeAndWait返回值
我有一个JavaGUI应用程序,其中的视图应该提供一个函数,要求用户选择一个路径。在用户选择路径(或者如果用户取消)之前,函数应一直处于阻塞状态 由于函数不是在EDT线程的上下文中调用的,所以我使用invokeAndWait。它看起来像这样,其中path是视图的私有成员: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(
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”,但由于该变量更像是一个临时变量,我不喜欢使用它将其设置为成员变量。