Java 仅在循环中创建的最后一个JLabel上检测到鼠标侦听器

Java 仅在循环中创建的最后一个JLabel上检测到鼠标侦听器,java,swing,user-interface,jlabel,mouselistener,Java,Swing,User Interface,Jlabel,Mouselistener,在循环中创建的一组jlabel中添加mouseListener时,我遇到了一个问题。当用户将鼠标悬停在标签上时,我正在创建的程序需要更改JLabel的图标 我创建了一个for循环来初始化全局声明的标签、设置边框、添加鼠标侦听器以及将标签添加到面板 JLabel label; for(int i = 0; i < 20; i++) { label = new JLabel(); label.setBorder(new LineBorder(Color.BLACK)); label

在循环中创建的一组
jlabel
中添加
mouseListener
时,我遇到了一个问题。当用户将鼠标悬停在标签上时,我正在创建的程序需要更改
JLabel
的图标

我创建了一个for循环来初始化全局声明的标签、设置边框、添加鼠标侦听器以及将标签添加到面板

JLabel label;
for(int i = 0; i < 20; i++)
{
  label = new JLabel();
  label.setBorder(new LineBorder(Color.BLACK));
  label.setMouseListener(this);
  panel.add(label);
}
container.add(panel);
这似乎很好,它向框架添加了20个标签,并添加了边框,但由于某些原因,动作侦听器仅在添加的最后一个标签上被激活。有人能告诉我为什么会发生这种情况,或者给我指出正确的方向吗


感谢您的帮助

((JLabel)e.getSource()).setIcon(图像)

标签变量只引用了一个JLabel,最后一个被使用,因此if块将测试源的最后一个JLabel。换句话说,您的代码只执行您让它执行的操作。你想用if块实现什么?

请参阅我的内联注释以了解解释:-

JLabel label;
for(int i = 0; i < 20; i++)
{
  label = new JLabel(); // variable re-assignment!
  label.setBorder(new LineBorder(Color.BLACK));
  label.setMouseListener(this);
  panel.add(label);
}
// after executing the loop 20 times,
// 1) 'label' will hold the 20th instance of the JLabel due to variable re-assignment in loop
// 2) 'panel' will have 20 different instances of JLabel
container.add(panel);
JLabel标签;
对于(int i=0;i<20;i++)
{
label=new JLabel();//变量重新赋值!
label.setboorder(新线条边框(颜色为黑色));
label.setMouseListener(本);
面板。添加(标签);
}
//执行循环20次后,
//1)“label”将保留JLabel的第20个实例,这是由于在循环中重新分配了变量
//2)“面板”将有20个不同的JLabel实例
容器。添加(面板);

现在要解决您的问题,您应该有20个不同的鼠标侦听器实例,每个鼠标侦听器都应该有自己的JLabel

是的,那就是他想做的!1+@TerryN很高兴这有帮助-下一步是接受答案:-)道歉,这是非常新的:P完成!不需要20个单独的MouseStener,因为getSource将返回侦听的组件。
JLabel label;
for(int i = 0; i < 20; i++)
{
  label = new JLabel(); // variable re-assignment!
  label.setBorder(new LineBorder(Color.BLACK));
  label.setMouseListener(this);
  panel.add(label);
}
// after executing the loop 20 times,
// 1) 'label' will hold the 20th instance of the JLabel due to variable re-assignment in loop
// 2) 'panel' will have 20 different instances of JLabel
container.add(panel);