仅在循环中创建的最后一个JLabel上检测到MouseListeners

时间:2011-11-30 14:50:52

标签: java swing user-interface jlabel mouselistener

我在将MouseListeners添加到循环内创建的设定数量的Jlabels时遇到问题。当用户将鼠标悬停在标签上时,我正在创建的程序需要更改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);

然后在我的老鼠听众中

public void mouseEntered(MouseEvent e)
{
  if(e.getSource().equals(label))
  {
     label.setIcon(image);
  }
}

这似乎工作正常,它为帧添加了20个标签并添加了边框但由于某种原因,动作侦听器仅在添加的最后一个标签上被激活。任何人都可以告诉我为什么会这样或者指出我正确的方向吗?

感谢任何帮助。

3 个答案:

答案 0 :(得分:5)

((JLabel)e.getSource()).setIcon(image);

答案 1 :(得分:5)

您只有一个JLabel被label变量引用,最后一个使用,因此if块将测试源是最后一个JLabel。换句话说,你的代码只是做你要告诉它的事情。如果阻止你想用什么来完成?

答案 2 :(得分:0)

请参阅我的内联评论以获得解释: -

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);

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