我正在使用 MVC 创建一个基本计算器。到目前为止,我正在改编一个教程,该教程仅将两个用户输入的值相加。
目前,我添加到 View 中的每个按钮都有自己的监听器,这是可以的。但是,根据教程, Controller 的每个按钮都有一个 ActionListener 内部类。这会重复大量的代码。
如何为所有按下的按钮创建一个 ActionListener 类,并在按下的按钮的 id 上使用 case 语句?
在 View 中注册 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();
然后像往常一样创建按钮并注册处理程序
...
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
恕我直言,这种方法的唯一问题是它会创建一个巨大的 if-else
语句,这可能会变得难以维护。
在我看来,我会创建某种模型/构建器,其中包含一系列辅助方法(例如 add(Number)
、subtract(Number)
等) )并使用Actions API对于每个按钮的单独操作...但这只是我...
关于java - 如何为多个 JButton 创建单个 ActionListener,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17007807/