为什么听众在Java中彼此相互依赖?

时间:2013-03-30 13:06:00

标签: java swing actionlistener mouselistener

我写过MineSweeper游戏。我有一个按钮的两个监听器,

 class SampleClass extends MouseAdapter implements ActionListener  {

         //Some code here

          public void actionPerformed(ActionEvent event){ // Buttons listener..
               System.out.println("I came here to actionPerformed.");
               //Some Code
          }

         public void mouseClicked(MouseEvent event) { //Mouse listener..
               System.out.println("I came here to MouseClicked.");
              //Some Code
               if(event.getButton() == MouseEvent.BUTTON3){..}//If Right Mouse Button Is Clicked!!
               else if(event.getButton() == MouseEvent.BUTTON1){..}//If Left Mouse Button Is Clicked!!
         }
 }

我观察到的是,只要点击鼠标左键,就会调用唯一的actionPerformed而不是mouseClicked 。但是单击鼠标右键,会调用mouseClicked(正常情况下,不会调用actionPerformed)。

但是,当我删除ActionListener 时,然后在鼠标左键和右键鼠标点击的两次点击上调用,并且完全正常。

我想,两个听众是两个不同的独立线程,听取事件,但为什么一个人依赖其他?

2 个答案:

答案 0 :(得分:4)

没有两个听众不相互依赖。如果JButtonAction按下,space bar,或doClickleft click鼠标,则actionperformed可以触发ActionListener。这就是默认情况下JButton被调用的原因(假设actionPerformed已注册),当您通过左键单击鼠标mousePressedActionListener之前被调用,JButton事件被调用。如果MouseEvent未在JButton注册,则import javax.swing.*; import java.awt.event.*; import java.util.*; class Listeners extends JFrame { public void prepareAndShowGUI() { setTitle("Listeners dependency"); JButton button = new JButton("Click"); button.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent evt) { System.out.println("Action Listener has listened."); } }); button.addMouseListener(new MouseAdapter() { public void mouseClicked(MouseEvent evt) { System.out.println("Mouse Clicked."); } public void mousePressed(MouseEvent evt) { System.out.println("Mouse pressed."); } public void mouseReleased(MouseEvent evt) { System.out.println("Mouse Released."); } }); getContentPane().add(button); pack(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); setVisible(true); } public static void main(String stp[]) { SwingUtilities.invokeLater(new Runnable() { public void run() { Listeners listen = new Listeners(); listen.prepareAndShowGUI(); } }); } } 开始发挥作用并执行所需的操作。两个听众彼此独立工作。实际上,动作是以适当的顺序触发的......例如Mouse pressed. Action Listener has listened. Mouse Released. Mouse Clicked. 如果ActionListener和MouseListener都被注册了..那么触发的动作序列如下:

  1. 的mousePressed()
  2. 的actionPerformed()
  3. 的mouseReleased()
  4. 的mouseClicked()
  5. 此代码可以让您清楚了解这些要点。:

    {{1}}

    on单击JButton后输出:

    {{1}}

答案 1 :(得分:0)

AWT的MouseListenerMouseMotionListener处理在某些时候非常奇怪。 但正如我认为事件不应相互干扰。

如果组件没有鼠标侦听器 然后将鼠标事件提升到父容器。这意味着你 听到父母组件可以逃脱,仍然可以收到 在上面的用例中,如果某些其他代码将鼠标监听器添加到子组件而不是鼠标事件,则不会冒泡到父容器。 这真是一个糟糕的设计。

当且仅当我正在编写JComponent或PL& F的子类时,我更喜欢使用鼠标监听器,因为它们可能会被其他事件监听器覆盖。所以我想这就是你的情况发生的事情。一个建议是使用符合您目的的EventQueue