Return 来自 InvokeAndWait 的值
Return Value from InvokeAndWait
我有一个 Java GUI 应用程序,其中的视图应该提供一个功能,例如要求用户选择路径。在用户选择路径(或者如果用户取消)之前,该功能应该是阻塞的。
由于在 EDT 线程的上下文中未调用该函数,因此我使用了 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 上下文中选择的路径传递给最初调用的函数,并 return 它在那里。以下行已被阻止:
path = new PathSelector(defaultPath).getPath();
目前我用私有成员path
解决了它,但实际上我不喜欢这个解决方案,因为路径更像是一个临时变量,实际上与[=30=无关] 本身。为此寻找另一种解决方案,我遇到了 SwingWorker
但我无法弄清楚如何解决我的 'problem'.
另一个想法可能是创建一个对象,它有一个字符串作为成员,getter 和 setter 来设置这个字符串并传递这个对象的引用,它可以设置字符串成员EDT 并在 getPath
函数中将其取回 return。
有没有更流畅的解决方案?
由于没有人想出另一种解决方案,我自己找到的最好的解决方案是:我创建了一个简单的对象,其中包含指向 return 的字符串。所以我在两个任务上下文中都有一个我可以使用的参考。有人对改进此解决方案有一些意见,我对此持开放态度。
这是保存字符串的 class。
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();
}
我有一个 Java GUI 应用程序,其中的视图应该提供一个功能,例如要求用户选择路径。在用户选择路径(或者如果用户取消)之前,该功能应该是阻塞的。
由于在 EDT 线程的上下文中未调用该函数,因此我使用了 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 上下文中选择的路径传递给最初调用的函数,并 return 它在那里。以下行已被阻止:
path = new PathSelector(defaultPath).getPath();
目前我用私有成员path
解决了它,但实际上我不喜欢这个解决方案,因为路径更像是一个临时变量,实际上与[=30=无关] 本身。为此寻找另一种解决方案,我遇到了 SwingWorker
但我无法弄清楚如何解决我的 'problem'.
另一个想法可能是创建一个对象,它有一个字符串作为成员,getter 和 setter 来设置这个字符串并传递这个对象的引用,它可以设置字符串成员EDT 并在 getPath
函数中将其取回 return。
有没有更流畅的解决方案?
由于没有人想出另一种解决方案,我自己找到的最好的解决方案是:我创建了一个简单的对象,其中包含指向 return 的字符串。所以我在两个任务上下文中都有一个我可以使用的参考。有人对改进此解决方案有一些意见,我对此持开放态度。
这是保存字符串的 class。
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();
}