添加ActionListeners并在其他类中调用方法

时间:2014-02-28 11:28:11

标签: java swing actionlistener

我需要一些帮助,因为我非常喜欢。

我试图在这里制作的程序,曾经用于我的意图,但是当我试图让我的代码更具可读性时,我遇到了关于ActionListener的问题。

在我创建一个新类以使用所有方法之前,我使用button.addActionListener(this);并且它工作得很好。现在我想把东西放在一个单独的课堂上,我完全不知道该怎么做。

所以我想我的问题是,我怎样才能让ActionListener在这样的情况下工作,或者我在这里做错了什么?

以下是我认为相关的部分代码(大部分已编辑完成):

    //Class with frame, panels, labels, buttons, etc.

    class FemTreEnPlus {
        FemTreEnPlus() {
            //Components here!

            //Then to the part where I try to add these listeners
            cfg.addActionListener();
            Exit.addActionListener();
            New.addActionListener();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
        public void run(){
        //Start the Program in the FemTreEnPlus Class
            new FemTreEnPlus();
        }     
    });  
}

这是带框架的类,这是另一个类,带有方法

public class FemTreEnMethods extends FemTreEnPlus implements ActionListener {

       //Perform Actions!
   public void actionPerformed(ActionEvent ae){  
       if(ae.getSource() == cfgButton){
        configureSettings();
       }
       if(ae.getSource() == newButton){
        newProject();
       }     
       if(ae.getSource() == exitButton){
        exitProgram();
       }
 }

   //All methods are down here

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:3)

尽管教程的示例显示了以您的方式实现的侦听器的使用,但恕我直言更有用的是使用匿名内部类来实现侦听器。例如:

cfgButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerfomed(ActionEvent e) {
        // do the stuff related to cfgButton here
    }
};

newButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerfomed(ActionEvent e) {
        // do the stuff related to newButton here
    }
};

exitButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerfomed(ActionEvent e) {
        // do the stuff related to exitButton here
    }
};

这种方法具有以下优点:

  • 听众逻辑很好分开。
  • 您不需要那些嵌套if块来询问谁是该事件的来源。
  • 如果添加新按钮,则无需修改侦听器。只需添加一个新的。

当然这取决于具体情况。如果一组组件(例如单选按钮或复选框)的行为相同,那么只有一个侦听器并使用EventObject.getSource()来处理事件的源是有意义的。建议使用此方法here并举例说明here。请注意,这些示例也以这种方式使用匿名内部类:

ActionListener actionListener = new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {
        // do something here
    }
};