我在将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个标签并添加了边框但由于某种原因,动作侦听器仅在添加的最后一个标签上被激活。任何人都可以告诉我为什么会这样或者指出我正确的方向吗?
感谢任何帮助。
答案 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。