たとえば、ビューがユーザーにパスを選択するように求める機能を提供する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 コンテキストで選択されたパスを、最初に呼び出された関数に渡し、そこに返す方法でした。次の行はすでにブロックされています。
path = new PathSelector(defaultPath).getPath();
とりあえず私は private member で解決しましたpath
が、実際にはこの解決策が好きではありません.pathは一時的な変数であり、実際にはクラス自体とは何の関係もありません. これに対する別の解決策を探していたところ、 に出会いましたSwingWorker
が、これで「問題」を解決する方法がわかりませんでした。
別のアイデアは、getter と setter を使用してメンバーとして文字列を持つオブジェクトを作成して、この文字列を設定し、このオブジェクトの参照を渡して、EDT で文字列メンバーを設定し、getPath
関数でそれを返すことです。
誰かがよりスムーズな解決策を持っていますか?