Как уменьшить код при задавании ActionListener для кнопок?

Рейтинг: -1Ответов: 3Опубликовано: 29.05.2023

Мне нужно уменьшить код для более чистого и читабельного кода. Как это сделать?

number0Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number0Button.getText();
    }
});
number1Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number1Button.getText();
    }
});
number2Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number2Button.getText();
    }
});
number3Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number3Button.getText();
    }
});
number4Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number4Button.getText();
    }
});
number5Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number5Button.getText();
    }
});
number6Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number6Button.getText();
    }
});
number7Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number7Button.getText();
    }
});
number8Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number8Button.getText();
    }
});
number9Button.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += number9Button.getText();
    }
});
minucButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += minucButton.getText();
    }
});
divisionButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += divisionButton.getText();
    }
});
multiplicationButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += multiplicationButton.getText();
    }
});
plusButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        bufferNum += plusButton.getText();
    }
});

Ответы

▲ 0Принят

Можно вынести добавление ActionListener в отдельный метод, и использовать лямбда-выражение, так как ActionListener является функциональным интерфейсом, который сводится к Consumer<ActionEvent>:

private String bufferNum = "";

private void initButtonActions(JButton ... buttons) {
    for (JButton btn : buttons) {
        btn.addActionListener(ae -> bufferNum += btn.getText());
    }
}

// UI компоненты
JButton number0Button, number1Button, number2Button; // ... 
private void init() {
    // создать кнопки 
    number0Button = new JButton("0");
    number1Button = new JButton("1");
    number2Button = new JButton("2");
    // ...
    // добавить обработчики действий
    initButtonActions(number0Button, number1Button, number2Button); // и т.д.
}

Также можно определить отдельные методы, реализующий добавление текста кнопки к переменной bufferNum и передавать ссылку на него, что позволит сократить дублирование кода лямбд:

private void initButtonActions(JButton ... buttons) {
    Arrays.stream(buttons).forEach(this::addAction);
    // for (JButton btn : buttons) addAction(btn); // или цикл
}

private void addAction(JButton btn) {
    btn.addActionListener(this::appendButtonText);
}

private void appendButtonText(ActionEvent ae) {
    bufferNum += ((JButton) ae.getSource()).getText();
}
▲ 1
List<JButton> buttons = Arrays.asList(number0Button, 
                                      number1Button, 
                                      ...
                                      plusButton);

for (JButton button : buttons) {
    button.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            bufferNum += button.getText();
        }
    });
}
▲ 0

Если работаешь через Design (имеется почти во всех средах разработки), то на каждый компонент имеет вкладка Events и там их можно задавать и код будет генерироваться автоматически и нужно будет только дописать свою реализацию. введите сюда описание изображения

На скрине представлен NetBeans.