2013-01-23 28 views
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); 
    } 

如何重写就像我已经与mouseClicked完成的KeyListener类的方法keyPressed,并ActionPerformed我真的不希望重写keyTypedkeyReleased,只是自己的keyPressed。交互发生在另一个类中,名为VIEW重写许多类的许多方法中的一类

+0

您能告诉我们其他代码,以便我们可以更好地理解问题吗?我看不到任何会阻止你使用'@Override public void keyPressed(...)'的东西。 – MathSquared

回答

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 
    } 


} 
+0

谢谢,非常好的解决方案,正是我所期待的 – MooHa

9

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

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

3

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

如果你只需要实现一些KeyListener的方法,你应该使用KeyAdapter类。

+0

他已经在扩展MouseAdapter,所以他也不能扩展KeyAdapter。 –

+0

@JBNizet - OP可以使用匿名内部类或私有嵌套类来解决多重继承问题。 –

3

你不能这样做。

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

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

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

3

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

附上内部类的实例为监听器,而不是EventController本身。

0

搜索复合和Facade模式,重用代码。

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

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

}