我有一个添加到某些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();
}
});
}
}