【问题标题】:Overriding many methods of many classes in one class在一个类中覆盖许多类的许多方法
【发布时间】:2013-01-07 01:43:51
【问题描述】:
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,只是 @ 987654327@ 自己。交互发生在另一个名为 VIEW 的类中

【问题讨论】:

  • 您能否向我们展示其余的代码,以便我们更好地理解问题?我看不出任何可以阻止您使用 @Override public void keyPressed(...)

标签: java swing events actionlistener keylistener


【解决方案1】:

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

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

【讨论】:

    【解决方案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】:

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

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

    【讨论】:

    • 他已经在扩展 MouseAdapter,所以他不能也扩展 KeyAdapter。
    • @JBNizet - OP 可以使用匿名内部类或私有嵌套类来解决多重继承问题。
    【解决方案4】:

    你不能这样做。

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

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

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

    【讨论】:

      【解决方案5】:

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

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

      【讨论】:

        【解决方案6】:

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

        class SilverBullet implements Interface1, Interface2 {
           Concrete1 c1;
           Concrete2 c2;
        
           void someMethod() {
               c1.someMethod();
           } 
        
        }
        

        【讨论】:

          猜你喜欢
          • 2015-11-15
          • 2011-10-17
          • 2011-11-06
          • 2021-06-09
          • 1970-01-01
          • 1970-01-01
          • 2018-02-15
          • 2017-07-21
          • 1970-01-01
          相关资源
          最近更新 更多