Это не работает так, как вы ожидали.
Я вижу, что уже есть некоторые решения, но я чувствую, что немного больше обсуждений о том, что происходит на самом деле, может быть полезно.
Когда вы вызываете 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);
[...]
}
Вместо этого вам нужно реорганизовать это.Во-первых написать вспомогательный класс обработка результата:
общественного класс 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
}
}
});
}
Два вопроса:
- Этот способ программирования кажется довольно обратным, но это действительно так, как он работает.
- Что не так, так это то, что мне нужно определить второй вспомогательный класс в сторону
CommandListener
. Это действительно не хороший стиль. Я надеюсь, что это может быть улучшено, но поскольку я не вижу полного кода (который будет слишком много информации в любом случае), я должен оставить его вам, чтобы улучшить код и избавиться от беспорядка. Хотя я считаю, что вы хотите иметь модульный, многоразовый помощник диалогового окна ввода, это может быть не лучший подход; лучше определите Form
, TextField
и Command
, где вам нужен результат и получите его. Сделайте его повторно используемым на втором этапе после его запуска.
Нет способов сделать это. За исключением случаев, когда вы являетесь автором 'CommandListener'. – madhead
@madhead 'CommandListener' - это встроенный интерфейс, который имеет метод' CommandAction'. Я не могу изменить подпись метода overriden. – user1234524521
Вы не можете вернуть его так, потому что вы не знаете, когда будет запускаться commandAction. В этом методе вы просто даете его слушателю. – BobTheBuilder