0

少し混乱しています。私は次のものを持っています:

public static String showInputDialog() {
   Form frm = new Form();
   final Command cmd = new Command("Ok");
   final TextField txt = new TextField("Enter the text", null, 1024, 0);
   frm.addCommand(cmd);
   frm.append(txt);
   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                return txt.getString(); // Error !!
            } else {
                return null; // Error !!
            }
       }
   });
}

ご覧のとおり、入力ダイアログ文字列を返したいのですが、匿名クラス メソッドは void を返す必要があります。この問題を解決するにはどうすればよいですか?

4

4 に答える 4

1

これは期待どおりには機能しません。

すでにいくつかの解決策があるようですが、実際に何が起こっているのかについてもう少し議論することが役立つと思います.

コードを呼び出すと、frm.setCommandListener(new CommandListener() { ... })テキストを入力して送信できるダイアログがユーザーに表示されますが、コードは停止せず、ユーザーが終了するまで待機しません。代わりに、結果を生成せずにコードが実行され続けます。ユーザーが入力を完了して送信した後でのみ、結果を処理するためにコールバックされます。これは、かなり後で発生するか、まったく発生しない可能性があります。

次のようなこのメソッドを呼び出すコードがあると思います。

public void someMethod(int foo, String bar) {

   [...]
   String result = MyInputForm.showInputDialog();
   // do something with the result
   System.out.println("hey, got a result "+ result);
   [...]
}

代わりに、これを再編成する必要があります。最初に、結果を処理するヘルパー クラスを作成します。

public static class MyCallBack {

   public MyCallBack(... /* here pass in what you need to process the result*/) {
      ... remember necessary stuff in instance variables
   }

   public void processResult(String result) {
      // do something with the result
      System.out.println("hey, got a result "+ result);
      [...]
   }

}

次に、呼び出し側は次のことを行います。

public void someMethod(int foo, String bar) {

   [...]
   MyInputForm.showInputDialog( new MyCallBack(... here pass in stuff ...) );
   [...]
}

実際のコードは次のように変更する必要があります。

public static String showInputDialog(final MyCallBack callback) {
   Form frm = new Form();
   final Command cmd = new Command("Ok");
   final TextField txt = new TextField("Enter the text", null, 1024, 0);
   frm.addCommand(cmd);
   frm.append(txt);
   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                return callback.processResult(txt.getString());
            } else {
                return; // or just omit the else part
            }
       }
   });
}

2 つの問題:

  • このプログラミング方法はかなり後ろ向きに感じますが、実際にはこのように機能します。
  • 正しくないと感じるのは、CommandListener. それは本当に良いスタイルではありません。改善できることを願っていますが、完全なコードが表示されないため (とにかく情報が多すぎます)、コードを改善して混乱を取り除くためにそれをあなたに任せなければなりません. モジュール式で再利用可能な入力ダイアログ ヘルパーが必要だと思いますが、これは最善の方法ではない可能性があります。をより適切に定義しForm、結果が必要な場所で直接実行して実行しますTextFieldCommand実行した後、2 番目のステップで再利用可能にします。
于 2013-02-10T14:25:22.247 に答える
0

代わりに文字列で何かをしたり、どこかに保存したりする場合は、返す必要はありません。次に例を示します。

static String result;

public String commandAction(Command c, Displayable d) {
    if (c == cmd) {
        result = txt.getString();
    } else {
        result = null;
    }
}

ただし、スレッドの問題に対処する必要があります。

于 2013-02-10T13:31:45.690 に答える
0

CommandListenerが固定されている場合、2 つの可能なオプションは次のとおりです。

外部クラスでクラスメンバー変数を使用し、代わりにその変数に割り当てます

private static String myText;
...

public static String showInputDialog() {
   ...
   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                myText = txt.getString(); 
            } else {
                myText = null;
            }
       }
   });
}

または具体的な実装を作成しCommandListener、戻り値を新しい実装のプロパティとして設定します

このスニペットのメソッド/変数を非静的にすることを検討します...

于 2013-02-10T13:27:51.840 に答える
0

リスナーがいつ呼び出されるかわからないため、文字列を返すことはできません。ただし、文字列を取得したら、それで何かを行うことができます。

public static void showInputDialog() {

   StringHandler sh = new StringHandler();

   frm.setCommandListener(new CommandListener() {

       public void commandAction(Command c, Displayable d) {
            if (c == cmd) {
                sh.handle(txt.getString()); 
            } else {
                sh.handle(null);
            }
       }
 });}


public class StringHandler {
    public void handle(String s){
        // Do something with that string.
    }
}
于 2013-02-10T13:45:16.417 に答える