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。我该如何解决这个问题?
答案 0 :(得分: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);
[...]
}
相反,你需要重组这个。首先编写一个处理结果的辅助类:
公共静态类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
并使其运行。让它运行后,让它在第二步中重复使用。 答案 1 :(得分:0)
鉴于CommandListener is fixed,有两种可能的选择
在外部类中使用类成员变量&分配给该变量
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
的具体实现,并将返回值设置为新实现的属性
我想看一下在这个片段非静态中制作方法/变量......
答案 2 :(得分:0)
如果您使用String执行某些操作或将其存储在某处,则无需返回它,例如:
static String result;
public String commandAction(Command c, Displayable d) {
if (c == cmd) {
result = txt.getString();
} else {
result = null;
}
}
虽然您需要处理线程问题。
答案 3 :(得分: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.
}
}