これは期待どおりには機能しません。
すでにいくつかの解決策があるようですが、実際に何が起こっているのかについてもう少し議論することが役立つと思います.
コードを呼び出すと、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
、結果が必要な場所で直接実行して実行しますTextField
。Command
実行した後、2 番目のステップで再利用可能にします。