Java 如何为多个JButton创建一个ActionListener
我正在使用MVC创建一个基本计算器。到目前为止,我正在修改一个教程,它只将两个用户输入的值相加 目前,我添加到视图中的每个按钮都有自己的侦听器,这是正常的。但是,教程中的控制器每个按钮都有一个ActionListener内部类。这会重复大量代码 如何为所有按下的按钮创建一个ActionListener类,并对按下的按钮id使用case语句 在视图中注册oneButtonJava 如何为多个JButton创建一个ActionListener,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,我正在使用MVC创建一个基本计算器。到目前为止,我正在修改一个教程,它只将两个用户输入的值相加 目前,我添加到视图中的每个按钮都有自己的侦听器,这是正常的。但是,教程中的控制器每个按钮都有一个ActionListener内部类。这会重复大量代码 如何为所有按下的按钮创建一个ActionListener类,并对按下的按钮id使用case语句 在视图中注册oneButton void oneListener(ActionListener listenForOneButton){ on
void oneListener(ActionListener listenForOneButton){
oneButton.addActionListener(listenForOneButton);
}
为控制器内部类中的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 ...
}
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
最好定义该类可以处理的操作命令是常量,从而消除任何歧义
接下来,在包含按钮的类中,创建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 ...
}
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
然后按照常规创建按钮并注册处理程序
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 ...
}
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
IMHO这种方法唯一的问题是,它可以创建一个怪物if-else
语句,这可能会变得难以维护
在我看来,我会创建某种模型/构建器,其中包含一系列辅助方法(如
add(Number)
,subtract(Number)
等),并用于每个按钮的单独操作…但这只是我…从实现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 ...
}
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
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.
}
}
}
最好定义该类可以处理的操作命令是常量,从而消除任何歧义
接下来,在包含按钮的类中,创建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 ...
}
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
然后按照常规创建按钮并注册处理程序
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 ...
}
}
CalculatorHandler handler = new CalculatorHandler();
JButton plus = new JButton("+");
plus.setActionCommand(CalculatorHandler.ADD_ACTION_COMMAND);
plus.addActionListener(handler);
IMHO这种方法唯一的问题是,它可以创建一个怪物if-else
语句,这可能会变得难以维护
在我看来,我会创建某种模型/构建器,其中包含一系列辅助方法(如add(Number)
,subtract(Number)
等),并用于每个按钮的单独操作…但这只是我…公共类SingleActionListener实现ActionListener{
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.
}
}
}
public void initializeButtons(){
JButton[]按钮=新JButton[4];
字符串[]buttonNames=新字符串[]{“button1”、“button2”、“button3”、“button4”};
对于(int i=0;i<4;i++){
按钮[i]=新的JButton(按钮名称[i]);
}
}
public void addActionListenersToButtons(){
对于(int i=0;i<4;i++){
按钮[i].addActionListener(此);
}
}
公共无效ActionPerformed(ActionEvent ActionEvent){
if(actionEvent.getSource()==按钮[0]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[1]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[2]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[3]){
//完成要求的任务。
}
}
}
公共类SingleActionListener实现ActionListener{
public void initializeButtons(){
JButton[]按钮=新JButton[4];
字符串[]buttonNames=新字符串[]{“button1”、“button2”、“button3”、“button4”};
对于(int i=0;i<4;i++){
按钮[i]=新的JButton(按钮名称[i]);
}
}
public void addActionListenersToButtons(){
对于(int i=0;i<4;i++){
按钮[i].addActionListener(此);
}
}
公共无效ActionPerformed(ActionEvent ActionEvent){
if(actionEvent.getSource()==按钮[0]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[1]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[2]){
//完成要求的任务。
}
if(actionEvent.getSource()==按钮[3]){
//完成要求的任务。
}
}
}
+1表示操作
;参见DefaultEditorKit
和StyledEditorKit
作为示例。操作+1;请参见DefaultEditorKit
和StyledEditorKit
作为示例。