2013-02-10 126 views
0

我有點困惑。我有以下幾點:如何在匿名類中返回返回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 !! 
      } 
     } 
    }); 
} 

正如你所看到的,我想回到輸入對話框裏的字符串,而匿名類方法應該返回void。我該如何解決這個問題?

+0

沒有辦法做到這一點。除非你是'CommandListener'的作者。 – madhead 2013-02-10 13:24:31

+0

@madhead'CommandListener'是一個內置的接口,它具有'CommandAction'方法。我無法更改重寫方法的簽名 – user1234524521 2013-02-10 13:28:41

+0

您不能像這樣返回它,因爲您不知道commandAction何時運行。在這個方法中,你只需要把它作爲一個監聽器。 – BobTheBuilder 2013-02-10 13:36:05

回答

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 2013-02-10 13:30:03

+0

我想創建一個顯示輸入對話框的靜態方法。我怎樣才能返回'myText'變量? – user1234524521 2013-02-10 13:35:24

+0

你不會返回任何值,因爲這是'CommandListener'接口的限制。相反,您可以設置類變量。 – Reimeus 2013-02-10 13:36:32

0

你並不需要返回它,如果你不是做一些與字符串或存儲在某個地方,例如:

static String result; 

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

雖然您有線程的問題要處理。

+0

我想創建一個顯示輸入對話框的靜態方法。我怎樣才能返回結果變量? – user1234524521 2013-02-10 13:33:28

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 2013-02-10 13:53:04

+0

由於@Reimeus和我試圖告訴你,同步獲得這個值是一個壞方法。你需要使用某種回調(因爲我們都試圖告訴你)。因此,不要在某些方法中調用res = showInputDialog(),StringHandler應該在輸入時做你需要做的事情。 – BobTheBuilder 2013-02-10 14:00:08

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直接您需要結果並獲得該運行。讓它在運行後的第二步中重複使用。