如何用一个替换十几个动作监听器?

时间:2015-02-15 22:51:04

标签: java swing action actionlistener

我有9个形式相同的代码,例如:

btnExit.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    btnExitActionPerformed(evt);
  }
});

...有9个相应的链接代码,如下所示:

private void btnExitActionPerformed(ActionEvent evt) {   
  // some code *********************
}                                          

......以及大量类似的重复代码 适用于FocusListenerMouseListener

我试图通过分配来减少代码行数 按钮的文本到其动作命令并使用:

  public void actionPerformed(ActionEvent e) 
  {
    String c = e.getActionCommand();
    switch (c) {
      case "Clear output":        btnClearOutputActionPerformed(e); break;
      case "Search":              btnSearchActionPerformed(e);      break;
      case "Exit":                btnExitActionPerformed(e);        break;
  ...
    }
  }

它有效,但情况并不好。仍然重复。寻找优雅。

我无法相信以下方法甚至可以编译,但它不起作用,因为doClick()递归调用该方法。我天真地希望doClick()执行方法btnPatternMouseClickedActionPerformed()

  public void actionPerformed(ActionEvent e){
    Component[] c ;
    c = theFrame.getComponents();
    JButton b;
    for(Component x: c)
    {
      if(x instanceof JButton)
      {
        b = (JButton) x;
        if(b.getText().equals(e.getActionCommand()))
        {
          b.doClick(); // want it to execute code elsewhere
          return;
        }
      }
    }
  }

起初我觉得上面的方法很接近。现在我要放弃了。

我有三个问题:

(1)有没有办法减少前两段所示的重复代码?

(1a)上面的最后一种方法是否接近?可以轻松修复吗?

(2)类似于上面的actionPerformed方法(使用switch的方法)替换FocusListenerMouseListener代码的技巧是否会浪费时间实施?

2 个答案:

答案 0 :(得分:3)

你可以改变这个:

btnExit.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    btnExitActionPerformed(evt);
  }
});

...有9个相应的链接代码,如下所示:

private void btnExitActionPerformed(ActionEvent evt) {   
  // some code *********************
} 

到此:

btnExit.addActionListener(new ActionListener() {
  public void actionPerformed(ActionEvent evt) {
    // same code that was in the btnExitActionPerformed method.
  }
});

但也许更好的方法是将你的“控制”代码,监听器中的代码,你的“视图”代码,你的GUI分开,但是如何做到这将取决于你的问题和当前的代码库。 / p>


修改
你问:

  

我会责怪Swing GUI构建器(不好?)的习惯。

它并不是那么糟糕,并且比使用GUI类实现监听器接口更好很多

  

为什么Swing会这样做?为什么Swing会做很多事情!!

我不确定你的具体含义是什么。

  

所以关于“更好”:你是说将听众分成另一个类文件吗?你是否建议椰子迁移~~ ...

是的,是的。事实上,控件 - 监听器部分可以由几个类组成,但它们都可以在单个主控制类中使用。

  

我的意思是,我应该放弃我问题中的最后一种方法?

答案 1 :(得分:1)

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;

public class Example implements ActionListener{

 JButton buttons[] = new JButton[12];

 public Example(){


    for(int c=0; c<buttons.length; c++){
        buttons[c]=new JButton("I am button"+c);
        buttons[c].addActionListener(this);
    }   

  }


@Override
public void actionPerformed(ActionEvent e) {
    if(e.getSource() == buttons[0]){}
    if(e.getSource() == buttons[1]){}
    if(e.getSource() == buttons[2]){}
    if(e.getSource() == buttons[3]){}
    if(e.getSource() == buttons[4]){}
    if(e.getSource() == buttons[5]){}
    if(e.getSource() == buttons[6]){}
    if(e.getSource() == buttons[7]){}
    //....


}

}

这对你的代码来说还不够优雅吗?

其他东西:    例如,如果您具有位于同一团队中的按钮,例如:     拥有一个类(java Object)然后获取对象并创建按钮是一个好主意。

public class TVButton implements ActionListener{

   public TVButton(String name,String whatever){

  }


 @Override
   public void actionPerformed(ActionEvent e){


    //actionFor this button
  }


 }