我真的需要创建一个类来处理java中的每个事件吗?

时间:2012-01-28 04:11:46

标签: java actionlistener

class SomeClass implements ActionListener
{
    public void actionPerformed(ActionEvent e)
        {
           // do something
        }
}

如果我有4个按钮,我真的需要创建4个类来处理每个按钮吗? 没有办法在当前类中使用方法吗?

3 个答案:

答案 0 :(得分:3)

您可以使用匿名内部类。例如:

button1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        doButton1Stuff();
    }
});
button2.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        doButton2Stuff();
    }
});

匿名内部类可以访问所有包含类的方法和变量,包括private个。

或者,您可以创建一个ActionListener并为所有四个按钮注册它。这样做的缺点是你需要ActionListener内部的逻辑来确定按下了哪个按钮(假设每个按钮做了不同的事情):

ActionListener a = new ActionListener() {
    public void actionPerformed(ActionEvent e) {
        if (e.getSource() == button1) {
            doButton1Stuff();
        }
        if (e.getSource() == button2) {
            doButton2Stuff();
        }
        ...
    }
}
button1.addActionListener(a);
button2.addActionListener(a);

请注意,此示例仍使用匿名内部类,但如果您愿意,也可以使用命名类。

最后,使用Swing,您可以利用Action类。 Action的行为与ActionListener非常相似,但有许多功能可以在很多情况下简化GUI开发。

答案 1 :(得分:2)

不,当然你不需要创建4个类。您可以简单地创建一个类来处理按钮代码,2个类,或3个或4个类(如果需要),甚至可以使用当前不建议使用的GUI类(this)。

您的任何内部侦听器类都可以调用GUI类中的方法。

编辑:一个视图控件示例,其中一个控件类用于处理多个按钮:

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

import javax.swing.*;

public class QuickMVC {
   private static void createAndShowGui() {
      QuickMvcView view = new QuickMvcView();
      QuickMvcControl control = new QuickMvcControl();
      view.setControl(control);

      JFrame frame = new JFrame("QuickMVC");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      frame.getContentPane().add(view.getMainPanel());
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}

class QuickMvcView {
   private JPanel mainPanel = new JPanel();
   private QuickMvcControl control;

   public QuickMvcView() {
      JButton button1 = new JButton("Button 1");
      JButton button2 = new JButton("Button 2");

      button1.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            if (control != null) {
               control.button1Action(e);
            }
         }
      });
      button2.addActionListener(new ActionListener() {
         public void actionPerformed(ActionEvent e) {
            if (control != null) {
               control.button2Action(e);
            }
         }
      });

      mainPanel.add(button1);
      mainPanel.add(button2);
      mainPanel.add(new JButton(new AbstractAction("Exit") {
         public void actionPerformed(ActionEvent e) {
            if (control != null) {
               control.exitAction(e);
            }
         }
      }));
   }

   public JPanel getMainPanel() {
      return mainPanel;
   }

   public void setControl(QuickMvcControl control) {
      this.control = control;
   }
}

class QuickMvcControl {

   public void button1Action(ActionEvent e) {
      System.out.println("called from button 1");
   }

   public void exitAction(ActionEvent e) {
      JComponent comp = (JComponent) e.getSource();
      Window win = SwingUtilities.getWindowAncestor(comp);
      win.dispose();
   }

   public void button2Action(ActionEvent e) {
      System.out.println("called from button 2");
   }

}

答案 2 :(得分:1)

附加相同的侦听器类,但根据事件源(单击该按钮)具有不同的实现方法。

您可以考虑使用getSource()来查找发生的对象事件并调用相应的方法。