2

何かを返す必要があるメソッドがあり、それを行うために UI に何かを表示する必要がある場合 (たとえば、ユーザーに質問するため) java.awt.EventQueue.invokeLater(new Runnable() {...});、UI スレッドで実行します (Android は を使用して同様のことを行いますrunOnUiThread()) 。 . そこから何かを返すにはどうすればよいRunnableですか? 例えば:

public String askQuestion()
{
    java.awt.EventQueue.invokeLater(new Runnable() {
        @Override
        public void run() {
            String response = JOptionPane.showInputDialog(null, "What is 2+2?");
            //how do I return this response object to the method?
        }
    });
}

コンパイルで割り当てが許可されないため、最終的なローカル変数を使用できません。クラス変数を使用してアクセスできますClass.this.<variable>が、これを達成するための最良/唯一の方法はありますか?

編集:これ以外のものも返す必要がありStringます。これは単なる例です。

4

1 に答える 1

3

次のように進めることができます。

public String askQuestion()throws Exception
   {
    final StringBuilder sBuilder = new StringBuilder();
    java.awt.EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            String response = JOptionPane.showInputDialog(null, "What is 2+2?");
            sBuilder.append(response);
        }
    });
   return sBuilder.toString();
}

これは、次の方法でも解決できます。

String sResponse;//make sResponse a field of class xyz
public String askQuestion()throws Exception
 {
    java.awt.EventQueue.invokeAndWait(new Runnable() {
        @Override
        public void run() {
            String response = JOptionPane.showInputDialog(null, "What is 2+2?");
            sResponse = response;
        }
    });
   return sResopnse;
}
于 2013-03-29T15:03:17.333 に答える