addMouseListener或addActionListener或JButton?
在定义JButton上的简单点击行为时,这是正确的方法吗? 而且,有什么区别?
JButton but = new JButton(); but.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { System.out.println("You clicked the button, using an ActionListener"); } });
要么
JButton but = new JButton(); but.addMouseListener(new java.awt.event.MouseAdapter() { public void mouseClicked(java.awt.event.MouseEvent evt) { System.out.println("You clicked the button, using a MouseListenr"); } });
MouseListener
是Swing中的低级事件侦听器(顺便说一下AWT)。
ActionListener
是更高级别的,应该使用它。
但是,比ActionListener
更好,应该使用javax.swing.Action
(实际上是一个ActionListener
)。
使用Action
允许在几个小部件之间共享它(例如JButton
, JMenuItem
……); 您不仅会共享按下按钮/菜单时触发的代码,还会共享状态,尤其是是否启用了操作(及其关联的小部件)。
您也应该可以使用键盘按下该按钮。 因此,如果只添加鼠标监听器,则在使用键盘时不会出现“按”事件。
我会选择动作听众,它更清楚。
当Button触发Action事件时,将调用已注册的ActionListener
,当窗口小部件检测到鼠标单击时,将调用MouseListener
。
在您的示例中,当您使用鼠标单击按钮时,这两种方法都显示相同的行为。 但是将焦点放在按钮上并按下SPACE
,这应该触发一个动作事件并触发动作侦听器而不是鼠标侦听器。
建议在按钮上使用ActionListener,否则您将无法使用键盘控制应用程序,或者您需要添加另一个键事件侦听器。
如果你想在单击Jbutton时做某事,动作监听器会更好,因为如果用户在JButton上按下鼠标然后在释放之前稍微移动鼠标,鼠标监听器就无法识别按钮上的鼠标。鼠标按钮一直保留在按钮内,但动作监听器确实如此。 MouseListener要求鼠标点击在鼠标按下和鼠标释放之间没有移动,这对我的用户来说并非如此。
- Java lambda表达式,转换和比较器
- 在具有generics的子类型的inheritance接口中覆盖方法
- Spring安全性从更深层访问UserDetailsService
- AngularJS中的文件上载JSON Spring MVC应用程序400错误请求所需的请求部分不存在
- 测试DAO时出错:sun.reflect.generics.reflectiveObjects.TypeVariableImpl无法强制转换为java.lang.Class
- 缺少`server’JVM(Java \ jre7 \ bin \ server \ jvm.dll。)
- 检索JPA实体列表和元数据
- 如何从一组XPath表达式生成XML文件?
- 在Android中使用MultipartEntityBuilder时,HttpPost返回错误