Java 删除netbeans中的鼠标侦听器

Java 删除netbeans中的鼠标侦听器,java,swing,listener,mouse,Java,Swing,Listener,Mouse,在netbeans中,会自动为组件创建鼠标侦听器 private void initComponents() { jLabel9 = new javax.swing.JLabel(); jLabel9.setBackground(new java.awt.Color(150, 192, 206)); jLabel9.setOpaque(true); jLabel9.setPreferredSize(new java.awt.Dimension(150, 150)

在netbeans中,会自动为组件创建鼠标侦听器

private void initComponents() {
    jLabel9 = new javax.swing.JLabel();

    jLabel9.setBackground(new java.awt.Color(150, 192, 206));
    jLabel9.setOpaque(true);
    jLabel9.setPreferredSize(new java.awt.Dimension(150, 150));
    jLabel9.addMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jLabel9MouseClicked(evt);
        }
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            jLabel9MouseEntered(evt);
        }
        public void mouseExited(java.awt.event.MouseEvent evt) {
            jLabel9MouseExited(evt);
        }
    });
问题是如何通过函数删除鼠标单击事件的侦听器?我正在尝试这样做:

void rem(){
   jLabel9.removeMouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jLabel9MouseClicked(evt);
        }
     });
}

然后,根据程序流的要求调用此函数。但这不起作用。有一件事我已经弄明白了,尽管我不确定这是否有效,因为我没有通过原始适配器删除侦听器。相反,我正在创建一个新的侦听器,并尝试删除原始侦听器。我在谷歌上搜索了几乎所有的有效链接,但没有一个有用

你的鼠标听器参考号在哪里?您正在使用匿名鼠标侦听器。您自己发现,您正在RemoveMouseStener方法中删除一个新的MouseStener。为什么?因为您无法再访问原始侦听器。为它创建一个参考,你的问题就解决了

   MouseListener mListener = new MouseListener(new java.awt.event.MouseAdapter() {
        public void mouseClicked(java.awt.event.MouseEvent evt) {
            jLabel9MouseClicked(evt);
        }
        public void mouseEntered(java.awt.event.MouseEvent evt) {
            jLabel9MouseEntered(evt);
        }
        public void mouseExited(java.awt.event.MouseEvent evt) {
            jLabel9MouseExited(evt);
        }
    });



jLabel9.addMouseListener(mListener);
jLabel9.removeMouseListener(mListener);
替代解决方案,但第一个更容易:

MouseListener[] mListener = jLabel9.getMouseListeners();
for (MouseListener ml : mListener) {
    jLabel9.removeMouseListener(ml);
}

就像佐尔特埃贝尔说的那样。 课堂测试{

JLabel jLabel9 = new JLabel();
MouseAdapter adapter = new MouseAdapter() {
    public void mouseClicked(java.awt.event.MouseEvent evt) {
        jLabel9MouseClicked(evt);
    }

    public void mouseEntered(java.awt.event.MouseEvent evt) {
        jLabel9MouseEntered(evt);
    }

    public void mouseExited(java.awt.event.MouseEvent evt) {
        jLabel9MouseExited(evt);
    }
};

private void initComponents() {
    jLabel9 = new javax.swing.JLabel();

    jLabel9.setBackground(new java.awt.Color(150, 192, 206));
    jLabel9.setOpaque(true);
    jLabel9.setPreferredSize(new java.awt.Dimension(150, 150));
    jLabel9.addMouseListener(adapter);
}

void rem() {
    jLabel9.removeMouseListener(adapter);
}

看看这个主题:@ZsoltÉbel我已经看到了。如果你注意到,在这里,一个新的鼠标适配器正在制作、使用,然后被删除。但是我的情况不同。我想删除一个已经创建的鼠标适配器的实例。如果你想要一个暴力方法,JComponent有一个getMouseListeners方法,它可以让你访问所有的鼠标适配器他将侦听器附加到组件上,但我会经常将其与careThanx一起使用…!虽然第一个与我在其他链接上发现的类似。但它不起作用。可能是因为我们没有参考原始适配器。但是您的替代解决方案工作得非常好。您是否可以建议如何从组件中删除特定侦听器许多其他的…如我只想删除mouseClicked事件?侦听器是接口,这意味着它们包含抽象方法。如果实现接口,则必须实现其方法。或者必须声明类抽象,并将其留给子类来实现缺少的方法。因此,不能仅删除mouseClicked方法,因为您的类不符合接口约定。这是一篇有用的文章: