有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在一个类中重写多个类的多个方法

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,就像我对mouseClickedActionPerformed所做的那样。我真的不想重写keyTypedkeyReleased,只重写keyPressed。交互发生在另一个名为VIEW的类中


共 (6) 个答案

  1. # 1 楼答案

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

    class SilverBullet implements Interface1, Interface2 {
       Concrete1 c1;
       Concrete2 c2;
    
       void someMethod() {
           c1.someMethod();
       } 
    
    }
    
  2. # 2 楼答案

    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
       }
    
    
     }
    
  3. # 3 楼答案

    Swing提供了Adapter classes来帮助重写方法,而无需在侦听器类中执行所有这些方法

    如果只需要实现KeyListener的一些方法,那么应该使用KeyAdapter

  4. # 4 楼答案

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

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

  5. # 5 楼答案

    你不能这样做

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

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

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

  6. # 6 楼答案

    不能这样做,因为在Java中您仅限于单一继承。因此,您必须实现KeyListener,并为这两个方法提供一个实现(它什么也不做)

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