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

Moo*_*oHa 3 java events swing keylistener actionlistener

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);
    }
Run Code Online (Sandbox Code Playgroud)

我如何覆盖keyPressedKeyListener类的方法,就像我已经完成的那样mouseClicked,ActionPerformed我真的不想覆盖keyTypedkeyReleased,只是keyPressed它自己.交互发生在另一个名为VIEW的类中

JB *_*zet 9

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

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


Gui*_*let 7

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

class EventController extends MouseAdapter, KeyAdapter
Run Code Online (Sandbox Code Playgroud)

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

现在,这种问题的解决方案始终是相同的,使用组合而不是继承.你可以很容易地拥有两个内部类:一个是扩展的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
   }


 }
Run Code Online (Sandbox Code Playgroud)