听众和适配器有什么区别?
我试图区分监听器和适配器。
它们几乎是一样的但是在监听器中你必须实现接口中的所有方法,但是使用适配器你可以选择只实现你需要的方法,这样代码就是清理器并且更容易阅读?
我也被告知适配器只允许一个实现实例化,你无法实例化监听器,我不完全理解这一点。
有人可以解释哪一个更好用,哪些你可以做一个但你不能用另一个?
WindowListener是强制您override
所有方法的接口,而WindowAdapter是WindowListener
实现,您只需要override
您想要处理的方法。
WindowListener
是一个接口,意味着你无法实例化WindowListener
,而WindowAdapter
是具体类,你可以使用new
运算符来实例化。
当您使用WindowAdapter
,代码更干净,您的类只覆盖您想要的方法。 例如:
的WindowListener
public class CloseListener implements WindowListener { // im not interest on this event, but still need to override it @Override public void windowOpened(WindowEvent e) { } // im not interest on this event, but still need to override it @Override public void windowClosing(WindowEvent e) { } @Override public void windowClosed(WindowEvent e) { System.exit(0); } // im not interest on this event, but still need to override it @Override public void windowIconified(WindowEvent e) { } // im not interest on this event, but still need to override it @Override public void windowDeiconified(WindowEvent e) { } }
WindowAdapter的
在使用适配器时,代码更清晰:
// at JFrame class addWindowListener(new CloseListener()); // reusable Close Listener public class CloseListener extends WindowAdapter { @Override public void windowClosed(WindowEvent e) { System.exit(0); } }
要么
addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent e) { System.exit(0); } });
所以我建议使用WindowAdapter
,但不一定要遵循 。 但是,存在两个与WindowAdapter
相同的API,以便于创建侦听器对象。
编辑:
由于WindowListener
是interface
,因此您可以在JFrame子类中实现它。
public class MainWindow extends JFrame implements WindowListener { // this is ok } public class MainWindow extends JFrame, WindowAdapter { // this is not allow }
但你不能用WindowAdapter
做到这一点。
你可以用任何一种方法做任何事情,但是如果从界面开始,你的代码就会有很多样板。 我确定你注意到了,当你尝试了它。 关于实例化等的陈述是一种非常复杂的说法,并且存在很多术语混淆。 你可以写
c.addWindowListener(new WindowListener() { @Override public void windowActivated(WindowEvent arg0) { } @Override public void windowClosed(WindowEvent arg0) { System.exit(0); } @Override public void windowClosing(WindowEvent arg0) { } @Override public void windowDeactivated(WindowEvent arg0) { } @Override public void windowDeiconified(WindowEvent arg0) { } @Override public void windowIconified(WindowEvent arg0) { } @Override public void windowOpened(WindowEvent arg0) { } });
或者你可以写
c.addWindowListener(new WindowAdapter() { @Override public void windowClosed(WindowEvent arg0) { System.exit(0); } });
在两种情况下,您都没有实例化 WindowListener
或WindowAdapter
– 您正在创建实现WindowListener
/ extend WindowAdapter
匿名类。 但是当你直接实现接口时,你被迫实现所有方法,当你扩展适配器类时,你只能覆盖你需要的东西。 该类已经具有您必须在Listener
案例中编写的这些空实现。
有几个适配器类,如MouseAdapter,KeyAdapter,WindowAdapter,可以扩展,从而避免编写您不需要的方法。
接口的东西是你必须写出你不需要的所有方法。 Adapter类可以进一步为Sub Classed,作为覆盖所需方法的方法。
当您计划使用大多数接口方法时,将使用侦听器。 当你只需要使用一些方法时,适配器会更好b / c你不必覆盖其余的方法。
还有另一个方面,其他答案没有解决:API演变。 提供适配器类(也就是接口的空或默认实现)使得在接口中引入新方法不那么痛苦。 如果API仅提供接口,则客户端被迫实现它们,如果向接口添加新方法,则所有实现类都将中断。 但是,如果提供了默认实现,那么客户端就有机会扩展它们,除了方便之外,它们可以帮助它们升级到更新的API版本。 使用Java 8的默认方法 ,默认/空实现变得不那么重要了,但在旧版本中它们可能很方便。
- 尽可能快地清除透明的BufferedImage
- SwingUtilities.invokeLater采用Runnable并在EDT上运行它?
- 使用KeyListener更改字符串背景并在键释放时将其设置回来 键入Tutor计划
- 用户空闲时间超过10分钟后,Java应用程序会使屏幕显示无响应
- 是否可以使用awt.Toolkit和java中的剪贴板知道剪贴板中复制的内容是否是mp3文件
- 使用setText清除TextField的内容在AWT中不起作用
- 一个动作监听器,两个JButtons
- 用于绘制棋盘的Java swing / awt组件
- Java awt.Robot:CTRL + ALT + DEL没有显示所需的屏幕