1

我在 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 中选择一个文本。

现在我想在我处于编辑模式时删除运动监听器,并在我不编辑时添加它。

所以这就是我试图删除它的原因,或者简单地说我需要禁用运动监听器。

4

2 回答 2

3
  • 输出正确,JTextField 有另一个通知器实现 API,它们是从添加的 MouseListener 通知的

  • 看看什么调试器返回

在此处输入图像描述

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();
            }
        });
    }
}
于 2013-07-30T09:41:16.203 回答
3

您可以为监听器定义您的类(内部类)而不是匿名内部类,并通过监听器调用 instanceof 来查找是否添加了您的实例。

或者,您可以定义一个标志,指示侦听器是否应处理事件。默认情况下将标志设置为真。当您必须跳过事件(在您的编辑模式下)并在之后重置时设置为 false。

于 2013-07-30T09:54:17.663 回答