2

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;
    }
}
Fred
  • 31
  • 1
  • 1
  • 2

4 Answers4

8

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 (and String, but only in Java 7 and later).

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
  • 302,674
  • 57
  • 556
  • 614
8

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
  • 9,395
  • 3
  • 31
  • 35
  • 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 Nov 03 '09 at 13:09
4

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
  • 54,009
  • 15
  • 113
  • 152
1

The ActionEvent contains an ActionCommand field which is a String. If not set while creating the Button it defaults to the text of the button. You can use that instead.

Something like:

switch(e.getActionCommand()) {
    case "Radius":
          ....
    case "Height":
          ....
}
IniasP
  • 125
  • 1
  • 6
Dakshinamurthy Karra
  • 5,353
  • 1
  • 17
  • 28