views:

387

answers:

3

I would like to check on which actionEvent has occurred with 'ActionEvent e' and 'e.getSource'. Can I use a switch case for this?

    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;
 } }
+4  A: 

Yes, you can use switch in actionPerformed.

No, you can't use it like you showed it here.

switch only supports primitive types and enums (String supports is comming in JDK7, however).

Another problem is that the case-values values must be compile time constants.

You'll need code like this:

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));
    }
}
Joachim Sauer
You can also switch on Enums.
Jonathan Feinberg
Thanks, to bad. So I guess I can't use switch, case then.
Fred
Are Strings really allowed in switch? I though it's comming only in Java 7, no?
quosoo
Josh Bloch made a push for it but I havent heard anything
John V.
Java 7 will allow Strings for switch, as part of Project Coin. It is not allowed in previous versions.
Michael Easter
@Jonathan: yes, I got mixed up in my explanation of what compile time constants can be. Strings are of course not valid in a switch, I tried to clarify that in my answer.
Joachim Sauer
+5  A: 

No, you can't. The types you can use in a switch statement is very limited. See The switch Statement.

You can of course just write this as a series of "if" and "else if" statements.

Wouter Coekaerts
Thanks for the link. It's good to know, I wanted to ask to be sure there wasn't some way around it before abandon it for, 'if, else'.
Fred
+2  A: 

As other solutions have pointed out, you cannot use switch in this context. However, rather than implementing one ActionListener containing a big if-then block, why not implement separate ActionListeners for each event source? This is a much more OO-based approach.

Typically your ActionListener implementations would be (small) anonymous inner classes anyway, and hence you wouldn't have to deal with a huge proliferation of .java files.

Adamski