我有一个添加到某些JLabels的mouseclicker事件,在单击其中一个后,我想删除该JLabel和mouseclicker事件之间的链接。
要将mouseclicker事件添加到JLabel,请使用以下代码:

JLabel.addMouseListener(this);


有一种方法可以消除效果消除后单击的JLabel吗?我怎样才能做到这一点?
我搜索了一些内容,但不确定如何描述问题并进行搜索,因此未找到结果。

最佳答案

这看似微不足道,但您可以执行以下操作:

myLabel.removeMouseListener(this);


第二种方法是将MouseListener保留在适当的位置,但要使其更聪明-即为它提供逻辑,使其可以根据需要忽略输入。如果像这样的块,这可能很简单

@Override
public void mousePressed(MouseEvent me) {
    if (someBoolean) {
        return;
    }
    // here have your usual code
}


然后在代码中,当您想停用MouseListener时,只需将侦听器的someBoolean字段更改为false。当需要反复打开和关闭侦听器时,使用布尔开关或标志很有用。

附带说明一下,通常最好不要为监听器使用this,因为这会使主GUI类承担太多责任。取而代之的是,将匿名内部类用于一些简单的行代码,而对其他涉及更多的侦听器代码使用命名的类。

例如:

import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.*;
import javax.swing.border.Border;

public class TurnListenerOnAndOff extends JPanel {
    private JLabel myLabel = new JLabel("My Label");
    private JCheckBox listenerEnabledCheckBox = new JCheckBox("Listener Enabled", true);

    public TurnListenerOnAndOff() {
        // make label bigger with a border
        Border outsideBorder = BorderFactory.createLineBorder(Color.black);
        Border insideBorder = BorderFactory.createEmptyBorder(5, 5, 5, 5);
        myLabel.setBorder(BorderFactory.createCompoundBorder(outsideBorder, insideBorder));

        // create and add MyMouseListener to my label
        myLabel.addMouseListener(new MyMouseListener());

        // add components to the GUI's main JPanel
        add(myLabel);
        add(listenerEnabledCheckBox);
    }

    private class MyMouseListener extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            // if the JCheckBox isn't checked...
            if (!listenerEnabledCheckBox.isSelected()) {
                return;  // let's get out of here
            }

            // otherwise if the check box is checked, do following code
            System.out.println("myLabel pressed!");
        }
    }

    private static void createAndShowGui() {
        TurnListenerOnAndOff mainPanel = new TurnListenerOnAndOff();

        JFrame frame = new JFrame("On and Off");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.getContentPane().add(mainPanel);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGui();
            }
        });
    }
}

09-25 22:21