java - 如何在Java中取消鼠标点击事件

标签 java swing mouselistener

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

JLabel.addMouseListener(this);

效果解决后有办法去掉JLabel被点击吗?我怎样才能做到这一点? 我搜索了一些内容,但不确定如何描述问题并搜索它,所以我没有找到结果。

最佳答案

这可能看起来微不足道,但您可以简单地执行以下操作:

myLabel.removeMouseListener(this);

选项二是保留 MouseListener,但使其更智能——即,为其提供逻辑,允许其在需要时忽略输入。这可以是一个简单的 if block ,例如

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

然后在您的代码中,当您想要停用 MouseListener 时,只需将监听器的 someBoolean 字段更改为 false 即可。当您需要重复打开和关闭监听器时,使用 boolean 开关或标志非常有用。

顺便说一句,您通常最好不要对监听器使用 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();
            }
        });
    }
}

关于java - 如何在Java中取消鼠标点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34681752/

相关文章:

java - 用于分析Java源代码的API

java - 如何在 Java Swing 中更新 JTextArea?

java - 拖动鼠标画线

java - 如何避免在任何嵌套组件上触发 mouseExited

java - 如何指定 JFrame 内鼠标单击的坐标?

java - Jackson反序列化错误: com. fastxml.jackson.databind.exc.UnrecognizedPropertyException:无法识别的字段

java - 将二维整数数组的行从小到大排序

java - 尝试在 Eclipse 外部使用资源/项目时出现工作区关闭错误

java - 在 GUI 中调整 JTable 中的列大小

java - JFrame.setBackground() 不工作——为什么?