removeMouseListener无法正常工作:如果我单击旧的JLabel,它仍会添加到变量分数中。每次经过时间后,旧对象应删除mouseListener
,而新对象应是唯一的对象。
Timer picTimer = new Timer(1000, new ActionListener(){
int oldrr=0;
int oldrc=0 ;
final int[] score = {0};
@Override
public void actionPerformed(ActionEvent e) {
MouseAdapter act = new MouseAdapter(){
@Override public void mouseClicked(MouseEvent e){
score[0]++;
lblTimer.setText(String.valueOf(score[0]));
}
};
arrayWM[oldrr][oldrc].removeMouseListener(act);
arrayWM[oldrr][oldrc].setIcon(null);
Random random = new Random();
arrayWM[oldrr][oldrc].setIcon(null);
int rr = random.nextInt(3 - 0 + 1) + 0;
int rc = random.nextInt(3 - 0 + 1) + 0;
oldrr = rr;
oldrc = rc;
arrayWM[rr][rc].setIcon(new ImageIcon("img/one.jpg"));
arrayWM[rr][rc].addMouseListener(act );
}
});
最佳答案
每次触发Timer
时,您将创建MouseAdapter
的另一个实例,并尝试从JLabel
中删除该实例,但是标签未向其注册该实例。然后,将MouseListener
的ANOTHER实例添加到标签,同时将一次注册到任何一个标签的MouseListener
的数量混合在一起。
相反,创建MouseAdapter
的单个实例并重新使用,也许像这样……
Timer picTimer = new Timer(1000, new ActionListener() {
int oldrr = 0;
int oldrc = 0;
final int[] score = {0};
MouseAdapter act = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
score[0]++;
lblTimer.setText(String.valueOf(score[0]));
}
};
@Override
public void actionPerformed(ActionEvent e) {
arrayWM[oldrr][oldrc].removeMouseListener(act);
arrayWM[oldrr][oldrc].setIcon(null);
Random random = new Random();
arrayWM[oldrr][oldrc].setIcon(null);
int rr = random.nextInt(3 - 0 + 1) + 0;
int rc = random.nextInt(3 - 0 + 1) + 0;
oldrr = rr;
oldrc = rc;
arrayWM[rr][rc].setIcon(new ImageIcon("img/one.jpg"));
arrayWM[rr][rc].addMouseListener(act);
}
});
关于java - removeMouseListener方法不起作用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33447095/