Ainvox
Ainvox

Reputation: 177

Replace many "else if" with something else

I am using an ActionListener and have lots of else if statements in order to know which button is pressed and run some code depending on the button.

Is there a way to make the code nicer? I have nearly 10 else if statements following each other, is there something else I could use instead?

Sample of code:

class BtnListener implements ActionListener {   
            @Override
        public void actionPerformed(ActionEvent e) {
            if (e.getSource() == menu.getOpen()) {
                getFile();
            } else if (e.getSource() == btnPlay) {

            } else if (e.getSource() == btnQuit)) {
         }
}

Thanks.

Upvotes: 0

Views: 157

Answers (4)

user2670200
user2670200

Reputation:

the best way to avoid all the "overheads" is to Lambda-Expressioned the buttons. Example:

JButton b1 = new JButton("Play");
b1.addActionListener(e -> play());
...
JButton bn = new JButton("Stop");
bn.addActionListener(e -> stop()); 
...
private void play() {
   ....// playing codes
}
...
private void stop() {
   ...// stopping codes
}
...

Upvotes: 0

Ravi MCA
Ravi MCA

Reputation: 2621

You can switch statement instead lot of else if ladder.

class BtnListener implements ActionListener {   
    @Override
    public void actionPerformed(ActionEvent e) {

        if (e.getSource() == menu.getOpen()) {
            getFile();
        }

        switch( e.getSource() ){

            case btnPlay:

            break;
            case btnQuit:

            break;

            default:
        }
    }
}

Upvotes: 0

Vlad Bochenin
Vlad Bochenin

Reputation: 3072

You can fill Map<Object, Consumer<ActionEvent>> before using of listener, for example in constructor, where key is source and value is a consumer for action event. In action perform just get consumer by key and invoke it.

class BtnListener implements ActionListener {
    Map<Object, Consumer<ActionEvent>> eventsMap = new HashMap<>();

    public BtnListener() {
        eventsMap.put(menu.getOpen(), actionEvent -> this.getFile());
        eventsMap.put(btnPlay, actionEvent -> { //do something
        });
        eventsMap.put(btnQuit, actionEvent -> { //do something else
        });
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Optional.of(e)
                .map(ActionEvent::getSource)
                .map(eventsMap::get)
                .ifPresent(
                        actionEventConsumer -> actionEventConsumer.accept(e)
                );
    }
}

Upvotes: 1

Arnaud
Arnaud

Reputation: 17524

You may use the action command of the button, and a switch-case block :

public void actionPerformed(ActionEvent e){

switch(e.getActionCommand()) {
    case "Open":
          open();
          break;
    case "Delete":
          delete();
          break;
    default :
          break;

    }
}

Of course you will have to set the action command of each button first, like :

openButton.setActionCommand("Open");

Note that switch-case with String objects only exists since JDK 7 : Strings in switch Statements

Upvotes: 1

Related Questions