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);
   [...]
}

相反,您需要重新组织它。首先编写一个帮助类来处理结果:

公共静态类 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,TextFieldCommand直接在您需要结果并使其运行的位置。让它在运行后的第二步中可重用。
于 2013-02-10T14:25:22.247 回答
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

如果您使用 String 执行某些操作或将其存储在某处,则不需要返回它,例如:

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

You cant return the string because you dont know when the listener will be called. You can do something with it once you have the string though.

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 回答