将事件监听器放在不同的类中更好吗?

时间:2014-05-27 16:40:58

标签: java swing model-view-controller jcombobox swingx

我的老师告诉我,actionListener的单独课程是最好的。在单独的类中,我应该只创建一个actionListener方法,例如。

public void actionPerformed(ActionEvent e) {
    if(e.getSource() == myButton) {
        //do something
    }
    else if(e.getSource() == myComboBox) {
        //do something
    }
}

或者我应该做多少?我有一种感觉,我应该做很多,但我不知道如何去做。不同的参数是什么?我将在我的View类中创建这个类的实例,其中按钮和组合框是。 (这将是Controller类,因为我试图做MVC)

对于按钮我希望背景在鼠标悬停在其上时改变颜色,然后当点击时做一些事情。组合框只需要返回被选为String的任何选项。

2 个答案:

答案 0 :(得分:2)

当您为动作侦听器创建单独的类时,您可以重用您创建的动作事件。

我会举一个例子

这个类有一个动作监听器

class  AListener implements ActionListener
{
    JTextField tf;
    AListener(JTextField tf)
    {
        this.tf=tf;
    }

    public void actionPerformed(ActionEvent e)
    {
        if((e.getActionCommand()).equals("Button1"))
            tf.setText("Button1 clicked");
        if((e.getActionCommand()).equals("Button2"))
            tf.setText("Button2 clicked");
        if((e.getActionCommand()).equals("Button3"))
            tf.setText("Button3 clicked");
    }
} 

这是GUI类,它有3个buttons和一个text field,每个按钮在文本字段中打印出不同的内容,因此您可以看到,使3个不同是不合逻辑的GUI类中的动作侦听器方法。

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class ActionDemo extends JFrame 
{
    public ActionDemo() 
    {
        setLayout(new FlowLayout());

        // Add buttons to the frame
        JButton b1=new JButton("Button1");
        JButton b2=new JButton("Button2");
        JButton b3=new JButton("Button3");
        JTextField tf=new JTextField(10);

        AListener listen=new  AListener(tf);
        b1.addActionListener(listen);
        b2.addActionListener(listen);
        b3.addActionListener(listen);

        add(b1);add(b2);add(b3);add(tf);
  }

  public static void main(String[] args) 
  {
      ActionDemo frame = new ActionDemo();
      frame.setTitle("Action Demo");
      frame.setLocationRelativeTo(null);
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.setSize(500, 100);
      frame.setVisible(true);
  }
}

现在,每次单击一个按钮时,只会调用一个动作侦听器方法。在这个方法中,我将检查哪个按钮叫我。

答案 1 :(得分:2)

我更喜欢为每个控制器动作编写一个单独的动作侦听器。它使我的简单思想变得简单。

我的经验法则是,对于非常短暂的(1-3行)动作听众,我将使它们成为内联匿名类。

对于中等大小的动作侦听器(1到3种方法),我将它们变成内部类,特别是如果动作侦听器需要来自外部主类的3个或更多字段。

对于大型动作听众,我会写一个单独的课程。