Как уменьшить код при задавании ActionListener для кнопок?
Мне нужно уменьшить код для более чистого и читабельного кода. Как это сделать?
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();
}
});
Ответы (3 шт):
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();
}
});
}
Можно вынести добавление 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();
}
Если работаешь через Design (имеется почти во всех средах разработки), то на каждый компонент имеет вкладка Events и там их можно задавать и код будет генерироваться автоматически и нужно будет только дописать свою реализацию.

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