我在JTextField中添加了一个MouseMotionListener。但是当我使用jf.getMouseMotionListeners().length
知道有多少鼠标监听器被注册时,我得到3 !!这引起了我一些问题,因为我试图根据长度添加一个监听器。如果它为零我添加或者我不想添加一个监听器。
下面是代码,我编写了代码来了解鼠标移动事件的长度。
public static void main(String args[]) {
JFrame fr = new JFrame();
final JTextPane jf = new JTextPane ();
jf.addMouseMotionListener(new MouseMotionListener() {
@Override
public void mouseMoved(MouseEvent arg0) {
System.out.println(jf.getMouseListeners().length);
}
@Override
public void mouseDragged(MouseEvent arg0) {
// TODO Auto-generated method stub
}
});
jf.setBounds(30,30,100,50);
fr.setSize(new Dimension(500, 500));
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.setLayout(null);
fr.add(jf);
fr.setVisible(true);
}
当我只添加一个监听器时,为什么长度为3?
有没有更好的方法来检查组件上的监听器是否已注册?
修改
这就是我想要做的事情。
我应该可以将JTextPane拖到窗口内的任何位置,我应该可以通过双击JTextPane来编辑它。
如果我在编辑时有一个拖动侦听器,如果要选择一个文本来设置样式,则拖动JTextPane而不是从JTextPane中选择一个文本。
现在我想在我处于编辑模式时删除motionlistener,并在我不编辑时添加它。
这就是我为什么要删除它或者简单的我需要禁用动画侦测器。
答案 0 :(得分:3)
输出正确,JTextField有另一个通知程序实现的API,它们是从添加的MouseListener
看看什么是debuger返回
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
public class MouseAndJTextField {
private JFrame fr = new JFrame();
private JTextField jf = new JTextField(20);
public MouseAndJTextField() {
jf.addMouseListener(new MouseListener() {
@Override
public void mouseReleased(MouseEvent arg0) {
}
@Override
public void mousePressed(MouseEvent arg0) {
}
@Override
public void mouseExited(MouseEvent arg0) {
}
@Override
public void mouseEntered(MouseEvent arg0) {
}
@Override
public void mouseClicked(MouseEvent arg0) {
System.out.println(jf.getMouseListeners().length);
}
});
fr.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
fr.add(jf);
fr.pack();
fr.setVisible(true);
}
public static void main(String args[]) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
MouseAndJTextField fs = new MouseAndJTextField();
}
});
}
}
答案 1 :(得分:3)
您可以为侦听器定义您的类(内部类)而不是Anonymous内部类,并通过调用instanceof的侦听器来查找是否添加了您的实例。
或者,您可以定义一个标志,指示侦听器是否应该处理事件。默认情况下将标志设置为true。当您必须跳过事件(在编辑模式下)并在之后重置时设置为false。