如何在 Java 中取消 mouseclicker 事件
How to cancel a mouseclicker event in Java
我在某些 JLabels
中添加了一个 mouseclicker 事件,在单击其中一个后,我想删除 JLabel
和 mouseclicker 事件之间的 link。
要将 mouseclicker 事件添加到 JLabel
,我使用此代码:
JLabel.addMouseListener(this);
有没有办法在效果解决后去掉JLabel
不被点击?我怎样才能做到这一点?
我搜索了一些东西,但我不确定如何描述问题并进行搜索,所以我没有找到结果。
这可能看起来微不足道,但您可以简单地这样做:
myLabel.removeMouseListener(this);
选项二是保留 MouseListener,但使其 更智能 -- 即为其提供逻辑,使其在需要时可以忽略输入。这可能是一个简单的 if 块,例如
@Override
public void mousePressed(MouseEvent me) {
if (someBoolean) {
return;
}
// here have your usual code
}
然后在您的代码中,当您想要 de-activate MouseListener 时,只需将侦听器的 someBoolean 字段更改为 false。当您需要反复打开和关闭侦听器时,使用布尔值 switch 或标志非常有用。
附带说明一下,您通常最好不要为您的听众使用 this
,因为这会给主 GUI class 太多的责任。而是使用匿名内部 classes 来表示简单的几行代码,或者使用命名 class 来表示更多涉及的侦听器代码。
例如:
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();
}
});
}
}
我在某些 JLabels
中添加了一个 mouseclicker 事件,在单击其中一个后,我想删除 JLabel
和 mouseclicker 事件之间的 link。
要将 mouseclicker 事件添加到 JLabel
,我使用此代码:
JLabel.addMouseListener(this);
有没有办法在效果解决后去掉JLabel
不被点击?我怎样才能做到这一点?
我搜索了一些东西,但我不确定如何描述问题并进行搜索,所以我没有找到结果。
这可能看起来微不足道,但您可以简单地这样做:
myLabel.removeMouseListener(this);
选项二是保留 MouseListener,但使其 更智能 -- 即为其提供逻辑,使其在需要时可以忽略输入。这可能是一个简单的 if 块,例如
@Override
public void mousePressed(MouseEvent me) {
if (someBoolean) {
return;
}
// here have your usual code
}
然后在您的代码中,当您想要 de-activate MouseListener 时,只需将侦听器的 someBoolean 字段更改为 false。当您需要反复打开和关闭侦听器时,使用布尔值 switch 或标志非常有用。
附带说明一下,您通常最好不要为您的听众使用 this
,因为这会给主 GUI class 太多的责任。而是使用匿名内部 classes 来表示简单的几行代码,或者使用命名 class 来表示更多涉及的侦听器代码。
例如:
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();
}
});
}
}