[英]How can I create a single ActionListener for multiple JButtons
我正在使用MVC创建一个基本的计算器。 到目前为止,我正在改编一个教程,该教程仅将两个用户输入的值加在一起。
目前,我要添加到视图中的每个按钮都有其自己的侦听器,可以。 但是,根据本教程的控制器每个按钮只有一个ActionListener内部类。 这重复了大量代码。
如何为所有按下的按钮创建一个ActionListener类,并在按下的按钮的ID上使用case语句?
在视图中注册oneButton
void oneListener(ActionListener listenForOneButton){
oneButton.addActionListener(listenForOneButton);
}
在Controller内部类中为oneButton实现ActionListener
class oneListener implements ActionListener{
public void actionPerformed(ActionEvent e){
int previousNumber, displayNumber = 0;
try{
previousNumber = theView.getPreviousDisplayNumber();
displayNumber = previousNumber+1;
theView.setDisplayNumber(displayNumber);
}
catch(NumberFormatException ex){
System.out.println(ex);
theView.displayErrorMessage("You Need to Enter Integers");
}
}
}
从实现ActionListener
类开始...
public class CalculatorHandler implements ActionListener{
public static final String ADD_ACTION_COMMAND = "Action.add";
public void actionPerformed(ActionEvent e){
if (ADD_ACTION_COMMAND.equals(e.getActionCommand()) {
// Do your addition...
} else if ...
}
}
最好定义此类可以处理的动作命令是常量,从而消除任何歧义...
接下来,在保存按钮的类中,创建ActionListener
的实例。
CalculatorHandler handler = new CalculatorHandler();
然后像往常一样创建按钮并注册handler
...
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
恕我直言,这种方法的唯一问题是它可以创建一个怪异的if-else
语句,这可能变得难以维护。
在我看来,我将创建一种包含一系列辅助方法(例如add(Number)
, subtract(Number)
等)的模型/构建器,并为每个按钮的各个操作使用Actions API ...但这就是只有我...
public class SingleActionListener implements ActionListener {
public void initializeButtons() {
JButton[] buttons = new JButton[4];
String[] buttonNames = new String[] {"button1", "button2", "button3", "button4"};
for (int i = 0; i < 4; i++) {
buttons[i] = new JButton(buttonNames[i]);
}
}
public void addActionListenersToButtons() {
for (int i = 0; i < 4; i++) {
buttons[i].addActionListener(this);
}
}
public void actionPerformedd(ActionEvent actionEvent) {
if (actionEvent.getSource() == buttons[0]) {
//Do required tasks.
}
if (actionEvent.getSource() == buttons[1]) {
//Do required tasks.
}
if (actionEvent.getSource() == buttons[2]) {
//Do required tasks.
}
if (actionEvent.getSource() == buttons[3]) {
//Do required tasks.
}
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.