我有一个Java应用程序,其中视图应该提供一个函数,要求用户选择一个路径,例如。函数应该是阻塞的,直到用户选择了路径(或者如果用户取消了)。
由于在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函数中。
有没有人有更顺畅的解决方案?
发布于 2015-11-07 17:41:12
由于没有人想出另一个解决方案,我自己能找到的最好的解决方案是:创建一个简单的对象,其中包含要返回的字符串。因此,我在两个任务上下文中都有一个引用,我可以使用。我有一些意见来改进这个解决方案,我很乐意。
这是保存字符串的类。
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();
}https://stackoverflow.com/questions/33330648
复制相似问题