我写过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 时,然后在鼠标左键和右键鼠标点击的两次点击上调用,并且完全正常。
我想,两个听众是两个不同的独立线程,听取事件,但为什么一个人依赖其他?
答案 0 :(得分:4)
没有两个听众不相互依赖。如果JButton
被Action
按下,space bar
,或doClick
或left click
鼠标,则actionperformed
可以触发ActionListener
。这就是默认情况下JButton
被调用的原因(假设actionPerformed
已注册),当您通过左键单击鼠标mousePressed
但ActionListener
之前被调用,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}}
on单击JButton后输出:
{{1}}
答案 1 :(得分:0)
AWT的MouseListener
和MouseMotionListener
处理在某些时候非常奇怪。
但正如我认为事件不应相互干扰。
如果组件没有鼠标侦听器 然后将鼠标事件提升到父容器。这意味着你 听到父母组件可以逃脱,仍然可以收到 在上面的用例中,如果某些其他代码将鼠标监听器添加到子组件而不是鼠标事件,则不会冒泡到父容器。 这真是一个糟糕的设计。
当且仅当我正在编写JComponent或PL& F的子类时,我更喜欢使用鼠标监听器,因为它们可能会被其他事件监听器覆盖。所以我想这就是你的情况发生的事情。一个建议是使用符合您目的的EventQueue。