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允许在几个小部件之间共享它(例如JButtonJMenuItem ……); 您不仅会共享按下按钮/菜单时触发的代码,还会共享状态,尤其是是否启用了操作(及其关联的小部件)。

您也应该可以使用键盘按下该按钮。 因此,如果只添加鼠标监听器,则在使用键盘时不会出现“按”事件。

我会选择动作听众,它更清楚。

当Button触发Action事件时,将调用已注册的ActionListener ,当窗口小部件检测到鼠标单击时,将调用MouseListener

在您的示例中,当您使用鼠标单击按钮时,这两种方法都显示相同的行为。 但是将焦点放在按钮上并按下SPACE ,这应该触发一个动作事件并触发动作侦听器而不是鼠标侦听器。

建议在按钮上使用ActionListener,否则您将无法使用键盘控制应用程序,或者您需要添加另一个键事件侦听器。

如果你想在单击Jbutton时做某事,动作监听器会更好,因为如果用户在JButton上按下鼠标然后在释放之前稍微移动鼠标,鼠标监听器就无法识别按钮上的鼠标。鼠标按钮一直保留在按钮内,但动作监听器确实如此。 MouseListener要求鼠标点击在鼠标按下和鼠标释放之间没有移动,这对我的用户来说并非如此。