3
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);
    }

我如何重写keyPressedKeyListener 类的方法,就像我对 所做的那样mouseClickedActionPerformed我真的不想重写keyTypedand keyReleased,只是keyPressed自己。交互发生在另一个名为 VIEW 的类中

4

6 回答 6

9

您不能,因为您仅限于 Java 中的单继承。所以你必须实现 KeyListener,并为这两种方法提供一个实现(什么都不做)。

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

于 2013-01-23T14:34:24.563 回答
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
   }


 }
于 2013-01-23T14:39:57.513 回答
3

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

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

于 2013-01-23T14:34:58.393 回答
3

你不能这样做。

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

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

既然你已经扩展了MouseAdapter,你必须实现ActionListenerme

于 2013-01-23T14:35:36.077 回答
3

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

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

于 2013-01-23T14:44:18.703 回答
0

搜索 Composite 和 Facade 模式,以重用代码。

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

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

}
于 2013-01-23T14:59:46.350 回答