2013-02-10 2 views
0

Я немного смущен. У меня есть следующий:Как вернуть String в анонимный класс для метода, возвращающего void

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 !! 
      } 
     } 
    }); 
} 

Как вы можете видеть, я хочу, чтобы вернуть диалоговую строку ввода, в то время как метод анонимного класса должен возвращать ничтожным. Как я могу решить эту проблему?

+0

Нет способов сделать это. За исключением случаев, когда вы являетесь автором 'CommandListener'. – madhead

+0

@madhead 'CommandListener' - это встроенный интерфейс, который имеет метод' CommandAction'. Я не могу изменить подпись метода overriden. – user1234524521

+0

Вы не можете вернуть его так, потому что вы не знаете, когда будет запускаться commandAction. В этом методе вы просто даете его слушателю. – BobTheBuilder

ответ

0

Учитывая, что CommandListener is fixed, 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 и установить возвращение значение как свойство новой реализации

Я бы хотел сделать способ/переменную в этом фрагменте нестатический ...

+0

Пожалуйста, ознакомьтесь с комментариями ниже вопроса. Кроме того, пожалуйста, покажите код, чтобы выяснить, как использовать переменную-член класса для решения проблемы. – user1234524521

+0

Я хочу создать статический метод, который отображает диалоговое окно ввода. Как я могу вернуть переменную 'myText'? – user1234524521

+0

Вы не будете возвращать любое значение, так как это ограничение интерфейса 'CommandListener'. Вместо этого вы можете установить переменную класса. – Reimeus

0

Вам не нужно, чтобы вернуть его, если вы вместо того, чтобы сделать что-то со строкой или хранить его где-нибудь, например:

static String result; 

public String commandAction(Command c, Displayable d) { 
    if (c == cmd) { 
     result = txt.getString(); 
    } else { 
     result = null; 
    } 
} 

Хотя вы будете иметь поточные вопросы для решения.

+0

Я хочу создать статический метод, который отображает диалоговое окно ввода. Как я могу вернуть переменную 'result'? – user1234524521

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. 
    } 
} 
+0

'String res = showInputDialog();'. Как я мог добиться того, что с помощью другого метода вызывается 'handle'? – user1234524521

+0

Как @Reimeus, и я пытался сказать вам, что это значение синхронно - плохой подход. Вам нужно использовать какой-то обратный вызов (как мы оба пытались показать вам). Поэтому вместо вызова res = showInputDialog() в некотором методе StringHandler должен делать то, что вам нужно делать, когда у вас есть вход. – BobTheBuilder

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, где вам нужен результат и получите его. Сделайте его повторно используемым на втором этапе после его запуска.