2013-01-23 52 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(); 
    } 

}