2

私は MineSweeper ゲームを書きました。その中で、ボタンには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 が呼び出され、完全に正常に動作します。

私は、2 つのリスナーは 2 つの独立したスレッドであり、イベントをリッスンしていると思いました

4

2 に答える 2

4

2 つのリスナーが互いに依存していないことはありません。、 、呼び出し、またはマウスのいずれかによって押された場合にJButtonを起動する のプロパティです。そのため、マウスの左クリックでを押すと、デフォルトで が呼び出されますが、 が呼び出される前に、イベントが呼び出されます。また、 が に登録されていない場合は、機能が開始され、必要なアクションが実行されます。2 つのリスナーは、互いに独立して動作します。実際、アクションは適切な順序で起動されます..たとえば、ActionListener と MouseListener の両方が登録されている場合..その後、起動されるアクションのシーケンスは次のようになります。Actionspace bardoClickleft clickactionperformedActionListenerJButtonactionPerformedmousePressedActionListenerJButtonMouseEventJButton

  1. mousePressed()
  2. actionPerformed()
  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();
            }
        });
    }
}

on JButton をクリックすると、次の出力が取得されます。

Mouse pressed.
Action Listener has listened.
Mouse Released.
Mouse Clicked.
于 2013-03-30T13:11:15.530 に答える