Using multiple JButtons with the same label in Java

前端 未结 3 377
温柔的废话
温柔的废话 2020-12-12 07:26

I have two buttons in my project that both have a \"+\" label. When the actionPerformed() method is called, it calls a specific method based on the label. How can I distigui

3条回答
  •  离开以前
    2020-12-12 07:40

    You shouldn't have a single listener handle the behavior for different responsibilities. If the two + buttons do not do the same thing, give the buttons separate listeners.

    This will allow your code to be a lot more cohesive. By reducing your listeners to 1 responsibility each, you'll be able to re-use those responsibilities. It also make testing easier, allowing you to test each behavior in complete isolation.

    Although if you must, ActionEvent#getSource() returns which ever component triggered the event. Doing a reference comparison will allow you to determine which object triggered the event.


    The best way to handle this would to separate the responsibilities your current listener has into separate classes:

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

    Lets assume FirstListener represents your first + button behavior. If that behavior requires any external objects (such as a field in a different class), simply pass it through the constructor:

    class FirstListener implements ActionListener {
        private Object dependency;
    
        public FirstListener(Object dependency) {
             this.dependency = dependency;
        }
    
        //actionPerformed declaration
    }
    

    You can do the same for the other buttons (for example, the second + button).

    If you feel this is a bit excessive, feel free to use lambda expressions to declare the listeners:

    //Java 8+
    button.addActionListener(event -> {
    
    });
    

    This doesn't give you the same modularity as the previous example, as the behavior is no longer separated from the actual class: you will be forced to change the implementation to change the behavior, rather than using dependency inversion to simply pass a different object which also implements ActionListener.

提交回复
热议问题