これを処理するクラスを作成することをお勧めします。以下のサンプルをご覧ください。
class SyncUserData implements Runnable {
private String value ;
public void run() {
value = JOptionPane.showInputDialog("Enter host name: ") ;
}
public String getValue() {
return value ;
}
}
// Using an instance of the class launch the popup and get the data.
String host;
SyncUserData syncData = new SyncUserData() ;
SwingUtilities.invokeAndWait(syncData);
host = syncData.getValue() ;
クラスを抽象化し、ジェネリックスを使用して任意のタイプの値を返すことができるようにすることで、このアプローチを拡張します。
abstract class SyncUserDataGeneric<Type> implements Runnable {
private Type value ;
public void run() {
value = process();
}
public Type getValue() {
return value ;
}
public abstract Type process() ;
}
String host;
SyncUserDataGeneric<String> doHostnameGen ;
doHostnameGen = new SyncUserDataGeneric<String>() {
public String process() {
return JOptionPane.showInputDialog("Enter host name: ");
}
};
host = doHostnameGen.getValue() ;
編集:EventDispatchThreadから実行されているかどうかを確認します。
if (SwingUtilities.isEventDispatchThread()) {
host = doHostnameGen.process() ;
} else {
SwingUtilities.invokeAndWait(doHostnameGen) ;
host = doHostnameGen.getValue() ;
}