覆盖一个类中许多类的许多方法

时间:2013-01-23 14:29:38

标签: java swing events actionlistener keylistener

public class EventController extends MouseAdapter implements ActionListener {

    private EventModel model;
    private EventView  view;
    String tableClick;
    Events events;    

    /** Constructor */
   public EventController(EventModel myModel, EventView myView){
       model = myModel;
       view = myView;     
   }

   public void setUpListeners() {
       this.view.addEventButton.addActionListener(this); 
       this.view.addEventMenuItem.addActionListener(this);
       this.view.editEventMenuItem.addActionListener(this);
       this.view.tableEvent.addMouseListener(this);                
   }

   @Override
   public void actionPerformed(ActionEvent e){
       Object button = e.getSource();
       if(button==this.view.addEventButton) {
           setEventDetails();          
       }                
   }

   @Override
   public void mouseClicked(java.awt.event.MouseEvent event) {
      int rowSelected = view.tableEvent.getSelectedRow();
       //blahblahblah
      view.changeDisplay(events);
    }

如何覆盖KeyListener类的方法keyPressed,就像我使用mouseClicked一样,ActionPerformed我真的不想覆盖keyTypedkeyReleased,只有keyPressed。交互发生在另一个名为VIEW

的类中

6 个答案:

答案 0 :(得分:9)

你不能,因为你只限于Java中的单一继承。因此,您必须实现KeyListener,并为这两种方法提供实现(不执行任何操作)。

更好的设计是分离责任,并有一个鼠标事件类,另一个用于动作事件,第三个用于关键事件。这些类可以作为匿名内部类实现。

答案 1 :(得分:7)

Java不支持多重继承,所以你不能扩展多个类,你不能有类似的东西:

class EventController extends MouseAdapter, KeyAdapter

但是,您可以实现多个接口,但似乎您希望避免这种情况。

现在,这种问题的解决方案总是一样的,使用组合而不是继承。您可以轻松拥有两个内部类:一个扩展KeyAdapter而另一个MouseAdapter。稍后,当您需要添加侦听器时,您将使用类的字段而不是this

这样的事情:

import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.MouseAdapter;

public class EventController {
    private EventModel model;
    private EventView  view;
    String tableClick;
    Events events;

    private MouseAdapter mouseListener = new MouseAdapter() {

        @Override
        public void mouseClicked(java.awt.event.MouseEvent event) {
          int rowSelected = view.tableEvent.getSelectedRow();
           //blahblahblah
          view.changeDisplay(events);
        }
    };

    private KeyAdapter keyAdapter = new KeyAdapter() {
        public void keyTyped(java.awt.event.KeyEvent e) {
            // Perform here whatever is needed
            // You also have access to your enclosing instance EventController.this and its methods
        }
    };

    private ActionListener actionListener = new ActionListener() {@Override
               public void actionPerformed(ActionEvent e){
           Object button = e.getSource();
           if(button==this.view.addEventButton) {
               setEventDetails();          
           }

       }



    /** Constructor */
   public EventController(EventModel myModel, EventView myView){
       model = myModel;
       view = myView;     
    }

   public void setUpListeners() {
       this.view.addEventButton.addActionListener(actionListener); 
       this.view.addEventMenuItem.addActionListener(actionListener);
       this.view.editEventMenuItem.addActionListener(actionListener);
       this.view.tableEvent.addMouseListener(mouseListener);
       // Here you can also add the keyadapter to your views
   }


 }

答案 2 :(得分:3)

Swing提供Adapter classes来帮助覆盖方法,而无需在Listener类中完成所有这些操作。

如果只需要实现KeyListener的某些方法,则应使用KeyAdapter类。

答案 3 :(得分:3)

你不能这样做。

一个类只能从另一个类扩展(Java中禁止多重继承)。

一个类可以实现多个接口,但由于接口不提供该方法的实现,您必须提供它(或声明类abstract,甚至是interface本身)。

由于您已经扩展MouseAdapter,因此您必须实施ActionListener

答案 4 :(得分:3)

不是直接在EventController中提供侦听器,而是在内部类中执行。例如,一个内部类可以扩展MouseAdapter,并调用EventController方法来完成实际工作。一个不同的内部类可以扩展KeyAdapter,并调用其他EventController方法。

将内部类的实例附加为侦听器,而不是EventController本身。

答案 5 :(得分:0)

搜索复合和外观模式,以重用代码。

class SilverBullet implements Interface1, Interface2 {
   Concrete1 c1;
   Concrete2 c2;

   void someMethod() {
       c1.someMethod();
   } 

}
相关问题