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

で行ったのと同じkeyPressedように KeyListener クラスのメソッドをオーバーライドするにはどうすればよいですか。実際にはmouseClickedandをオーバーライドしActionPerformedたくありません。対話は、VIEW という別のクラスで行われます。 keyTypedkeyReleasedkeyPressed

4

6 に答える 6

9

Javaでは単一の継承に制限されているため、できません。したがって、KeyListenerを実装し、これら2つのメソッドの実装を提供する必要があります(これは何もしません)。

より良い設計は、責任を分離し、マウスイベント用のクラス、アクションイベント用のクラス、およびキーイベント用のクラスを用意することです。クラスは、匿名の内部クラスとして実装できます。

于 2013-01-23T14:34:24.563 に答える
7

Java は多重継承をサポートしていないため、複数のクラスを拡張することはできません。次のようなものは使用できません。

class EventController extends MouseAdapter, KeyAdapter

ただし、複数のインターフェイスを実装できますが、それは避けたいようです。

さて、この種の問題に対する解決策は常に同じで、継承よりも構成を使用します。2 つの内部クラスを簡単に作成できます。1 つは拡張KeyAdapterし、もう1 つは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

EventController でリスナーを直接提供する代わりに、内部クラスでそれを行います。たとえば、1 つの内部クラスで MouseAdapter を拡張し、EventController メソッドを呼び出して実際の作業を行うことができます。別の内部クラスで KeyAdapter を拡張し、他の EventController メソッドを呼び出すことができます。

EventController 自体ではなく、内部クラスのインスタンスをリスナーとしてアタッチします。

于 2013-01-23T14:44:18.703 に答える
3

Swing は、Listener クラスですべてのメソッドを実行する必要なくメソッドをオーバーライドするのに役立つAdapter クラスを提供します。

KeyListener の一部のメソッドのみを実装する必要がある場合は、KeyAdapterクラスを使用する必要があります。

于 2013-01-23T14:34:58.393 に答える
3

このようにすることはできません。

クラスは別のクラスからのみ拡張できます(Java では多重継承は禁止されています)。

クラスは複数のインターフェースを実装できますが、インターフェースはメソッドの実装を提供しないため、それを提供する (またはクラスabstractを宣言するか、interfaceそれ自体を宣言する) 必要があります。

すでに拡張しているので、 meMouseAdapterを実装する必要がありますActionListener

于 2013-01-23T14:35:36.077 に答える
0

Composite および Facade パターンを検索して、コードを再利用します。

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

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

}
于 2013-01-23T14:59:46.350 に答える