Java稍后删除并添加回MouseListener

Java稍后删除并添加回MouseListener,java,swing,jlabel,mouselistener,Java,Swing,Jlabel,Mouselistener,我有4个JLabels 第一次单击时: 我将背景颜色更改为红色,并删除了我单击的JLabel鼠标侦听器 第二次单击时: 我将背景颜色更改为绿色,但是我之前单击的JLabel不应该从红色更改为绿色,因为我已经删除了MouseListener public void addbackMouseListener(JLabel label) { label.addMouseListener(this); <-- can't pass in this, what can I do? } 第三

我有4个
JLabel
s

第一次单击时:

我将背景颜色更改为红色,并删除了我单击的
JLabel
鼠标侦听器

第二次单击时:

我将背景颜色更改为绿色,但是我之前单击的
JLabel
不应该从红色更改为绿色,因为我已经删除了
MouseListener

public void addbackMouseListener(JLabel label) {
    label.addMouseListener(this); <-- can't pass in this, what can I do?
}
第三次单击时:

我想将
MouseListener
添加回第一次单击时已删除的
JLabel
MouseListener
,并将背景色更改为黑色,但我不确定如何添加回

我试图在我的
addbackMouseListener(JLabel标签)
中使用
addMouseListener
方法,但似乎我无法在参数中传递“this”,我不知道在
addMouseListener
的参数中传递什么

public void addbackMouseListener(JLabel label) {
    label.addMouseListener(this); <-- can't pass in this, what can I do?
}
public void addbackMouseListener(JLabel标签){

label.addMouseListener(this);
this
指的是
rMouseListener
,它扩展了
JFrame
,但没有实现
MouseListener

最好的办法是将原始的
MouseAdapter
作为一个内部类,并在创建类时创建它的实例,然后简单地添加和删除它

例如

public class rMouseListener extends JFrame {
    //...
    private MouseListener mouseListener;

    public rMouseListener() {

        mouseListener = new MouseHandler();
        for(int i = 0; i< 4; i++) {
            jLabel[i].setText(i + " ");
            panel.add(jLabel[i]);
            jLabel[i].addMouseListener(mouseListener);
        }
        //...
    }

    public void addbackMouseListener(JLabel label) {
        label.addMouseListener(mouseListener); 
    }

    //...

    public MouseHandler extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            JLabel label =(JLabel) e.getSource();
            clickCount++;

            /*remove the mouseListener for the label that is clicked*/
            if(clickCount == 1) {
                label.setBackground(Color.red);
                label.setOpaque(true);
                label.removeMouseListener(this);
                mouseRemoved = true;
            }

            /* to verify that the mouseListener for that label is removed after
            first click.*/
            else if(clickCount == 2) {
                label.setBackground(Color.green);
                label.setOpaque(true);
            }

            /*check if the mouseListener is removed.
              add back the mouseListener to the one that is perviously
              removed at clickCount = 1 if it's removed*/
            else if(clickCount == 3) {
                if(mouseRemoved) {
                    addbackMouseListener(label);
                    label.setBackground(Color.black);
                }
            }


        }
    }
}
公共类rMouseListener扩展JFrame{
//...
私人穆塞利斯滕纳;
公共资源监听器(){
mouseListener=新的鼠标手柄();
对于(int i=0;i<4;i++){
jLabel[i].setText(i+);
增补(jLabel[i]);
jLabel[i].addMouseListener(mouseListener);
}
//...
}
公共无效addbackMouseListener(JLabel标签){
label.addMouseListener(mouseListener);
}
//...
公共鼠标手柄扩展鼠标头适配器{
@凌驾
公共无效鼠标按下(MouseEvent e){
JLabel=(JLabel)e.getSource();
点击计数++;
/*移除所单击标签的鼠标侦听器*/
如果(单击计数=1){
标签.立根背景(颜色.红色);
label.set不透明(true);
标签。移除鼠标侦听器(本);
鼠标移动=真;
}
/*验证该标签的鼠标侦听器是否在
第一次点击*/
否则如果(单击计数==2){
标签.背景(颜色.绿色);
label.set不透明(true);
}
/*检查鼠标固定器是否已拆下。
将鼠标听筒添加回已损坏的鼠标听筒
如果已删除,则在clickCount=1时删除*/
否则如果(单击计数==3){
如果(鼠标移动){
addbackMouseListener(标签);
标签。背景(颜色:黑色);
}
}
}
}
}

指的是扩展了
JFrame
rMouseListener
,它不实现
MouseListener

最好的办法是将原始的
MouseAdapter
作为一个内部类,并在创建类时创建它的实例,然后简单地添加和删除它

例如

public class rMouseListener extends JFrame {
    //...
    private MouseListener mouseListener;

    public rMouseListener() {

        mouseListener = new MouseHandler();
        for(int i = 0; i< 4; i++) {
            jLabel[i].setText(i + " ");
            panel.add(jLabel[i]);
            jLabel[i].addMouseListener(mouseListener);
        }
        //...
    }

    public void addbackMouseListener(JLabel label) {
        label.addMouseListener(mouseListener); 
    }

    //...

    public MouseHandler extends MouseAdapter {
        @Override
        public void mousePressed(MouseEvent e) {
            JLabel label =(JLabel) e.getSource();
            clickCount++;

            /*remove the mouseListener for the label that is clicked*/
            if(clickCount == 1) {
                label.setBackground(Color.red);
                label.setOpaque(true);
                label.removeMouseListener(this);
                mouseRemoved = true;
            }

            /* to verify that the mouseListener for that label is removed after
            first click.*/
            else if(clickCount == 2) {
                label.setBackground(Color.green);
                label.setOpaque(true);
            }

            /*check if the mouseListener is removed.
              add back the mouseListener to the one that is perviously
              removed at clickCount = 1 if it's removed*/
            else if(clickCount == 3) {
                if(mouseRemoved) {
                    addbackMouseListener(label);
                    label.setBackground(Color.black);
                }
            }


        }
    }
}
公共类rMouseListener扩展JFrame{
//...
私人穆塞利斯滕纳;
公共资源监听器(){
mouseListener=新的鼠标手柄();
对于(int i=0;i<4;i++){
jLabel[i].setText(i+);
增补(jLabel[i]);
jLabel[i].addMouseListener(mouseListener);
}
//...
}
公共无效addbackMouseListener(JLabel标签){
label.addMouseListener(mouseListener);
}
//...
公共鼠标手柄扩展鼠标头适配器{
@凌驾
公共无效鼠标按下(MouseEvent e){
JLabel=(JLabel)e.getSource();
点击计数++;
/*移除所单击标签的鼠标侦听器*/
如果(单击计数=1){
标签.立根背景(颜色.红色);
label.set不透明(true);
标签。移除鼠标侦听器(本);
鼠标移动=真;
}
/*验证该标签的鼠标侦听器是否在
第一次点击*/
否则如果(单击计数==2){
标签.背景(颜色.绿色);
label.set不透明(true);
}
/*检查鼠标固定器是否已拆下。
将鼠标听筒添加回已损坏的鼠标听筒
如果已删除,则在clickCount=1时删除*/
否则如果(单击计数==3){
如果(鼠标移动){
addbackMouseListener(标签);
标签。背景(颜色:黑色);
}
}
}
}
}
更换:

addbackMouseListener(label);

您不需要
addBackMouseListener
方法

希望这有助于取代:

addbackMouseListener(label);

您不需要
addBackMouseListener
方法

希望这有帮助