这不像您预期的那样工作。
我看到已经有一些解决方案,但我觉得对实际发生的事情进行更多讨论可能会有所帮助。
当您调用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
直接在您需要结果并使其运行的位置。让它在运行后的第二步中可重用。