2

我写了扫雷游戏。因为我有两个监听器作为一个按钮,

 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时,同时单击鼠标左键和右键mouseClicked 都会被调用并且工作得很好。

我想,这两个监听器是两个不同的独立线程,监听事件,但是为什么一个依赖于另一个呢?

4

2 回答 2

4

没有两个听众不相互依赖。它是JButton触发的属性,Action如果它被按下,无论是通过space bar,或调用doClick或通过left click鼠标。这就是为什么当您按下鼠标左键但在被调用之前actionperformed,默认调用(假设ActionListener已注册) ,事件被调用。如果未在 中注册,就会发挥作用并执行所需的操作。两个 Listener 彼此独立工作。实际上,动作是按适当的顺序触发的。例如,如果 ActionListener 和 MouseListener 都已注册.. 那么触发的动作顺序如下:JButtonactionPerformedmousePressedActionListenerJButtonMouseEventJButton

  1. 鼠标按下()
  2. 动作执行()
  3. 鼠标释放()
  4. 鼠标点击()

此代码将使您清楚这些要点。:

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();
            }
        });
    }
}

在单击 JButton 时获得以下输出:

Mouse pressed.
Action Listener has listened.
Mouse Released.
Mouse Clicked.
于 2013-03-30T13:11:15.530 回答
0

AWT 的MouseListener处理MouseMotionListener行为有时非常奇怪。但作为我认为事件不应该相互干扰。

如果组件没有鼠标侦听器,则鼠标事件将被提升到父容器。这意味着您可以摆脱监听父组件,并且仍然接收其所有子组件的事件。在上面的用例中,如果其他一些代码将鼠标侦听器添加到子组件,那么鼠标事件将不会冒泡到父容器. 这真是一个糟糕的设计。

I prefer to use mouse listener if and only if I am writing a subclass of a JComponent or a PL&F because they can get overidden by other events listeners.So i guess this is what happened in your case.And one suggestion is to use EventQueue that should serve your purpose.

于 2013-03-30T13:56:57.817 回答