2009-11-03 63 views
1

我想檢查哪一個actionEvent發生了ActionEvent ee.getSource()。我可以爲此使用開關盒嗎?我可以使用switch-case,in actionPerformed方法在Java中

public void actionPerformed(ActionEvent e){ 
    switch(e.getSource()){ 
     case radius: 
      double r = validate(radius.getText()); 
      break; 
     case height: 
      double h = validate(height.getText()); 
      break; 
     case out: 
      out.setText(String.valueOf(h*r)); 
      break; 
    } 
} 

回答

6

是的,您可以使用actionPerformed中的開關。

不,你不能像你在這裏展示的那樣使用它。

switch僅支持基本類型和enum s(和String,但僅在Java 7和更高版本中)。

另一個問題是case-values值必須是編譯時間常量。

你需要這樣的代碼:

public void actionPerformed(ActionEvent e){ 
    if (e.getSource() == radius) { 
     double r = validate(radius.getText()); 
    else if (e.getSource() == height) { 
     double h = validate(height.getText()); 
    else if (e.getSource() == out) { 
     out.setText(String.valueOf(h*r)); 
    } 
} 
+4

您還可以切換上枚舉。 – 2009-11-03 12:37:23

+0

謝謝,不好。所以我想我不能使用開關,那麼情況。 – Fred 2009-11-03 12:40:34

+1

字符串是否真的允許在交換機中使用?我雖然只在Java 7中使用,不是嗎? – quosoo 2009-11-03 12:45:53

8

不,你不能。您可以在switch語句中使用的類型非常有限。 見The switch Statement

你當然可以把它寫成一系列「if」和「else if」語句。

+0

感謝您的鏈接。很高興知道,我想問一下,在放棄它之前,確保沒有任何方法可以解決它,'if,else'。 – Fred 2009-11-03 13:09:39

3

正如其他解決方案已經指出的那樣,在這種情況下不能使用開關。但是,不是實現一個包含大if-block的ActionListener,爲什麼不爲每個事件源實現單獨的ActionListeners?這是一個更加基於OO的方法。

通常,您的ActionListener實現將是(小)匿名內部類,因此您不必處理大量的.java文件。

1

ActionEvent包含一個ActionCommand字段,它是一個字符串。如果在創建Button時未設置,則默認爲按鈕的文本。你可以用它來代替。

喜歡的東西:

switch(e.getActionCommand()) { 
    case: "Radius": 
      .... 
    case: "Height": 
      .... 
} 
相關問題