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
,就像我使用mouseClicked
一样,ActionPerformed
我真的不想覆盖keyTyped
和keyReleased
,只有keyPressed
。交互发生在另一个名为VIEW
答案 0 :(得分:9)
你不能,因为你只限于Java中的单一继承。因此,您必须实现KeyListener,并为这两种方法提供实现(不执行任何操作)。
更好的设计是分离责任,并有一个鼠标事件类,另一个用于动作事件,第三个用于关键事件。这些类可以作为匿名内部类实现。
答案 1 :(得分: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
}
}
答案 2 :(得分:3)
Swing提供Adapter classes来帮助覆盖方法,而无需在Listener类中完成所有这些操作。
如果只需要实现KeyListener的某些方法,则应使用KeyAdapter类。
答案 3 :(得分:3)
你不能这样做。
一个类只能从另一个类扩展(Java中禁止多重继承)。
一个类可以实现多个接口,但由于接口不提供该方法的实现,您必须提供它(或声明类abstract
,甚至是interface
本身)。
由于您已经扩展MouseAdapter
,因此您必须实施ActionListener
我
答案 4 :(得分:3)
不是直接在EventController中提供侦听器,而是在内部类中执行。例如,一个内部类可以扩展MouseAdapter,并调用EventController方法来完成实际工作。一个不同的内部类可以扩展KeyAdapter,并调用其他EventController方法。
将内部类的实例附加为侦听器,而不是EventController本身。
答案 5 :(得分:0)
搜索复合和外观模式,以重用代码。
class SilverBullet implements Interface1, Interface2 {
Concrete1 c1;
Concrete2 c2;
void someMethod() {
c1.someMethod();
}
}