Java 多个JLabel上的鼠标侦听器未按预期工作

Java 多个JLabel上的鼠标侦听器未按预期工作,java,swing,jlabel,mouselistener,Java,Swing,Jlabel,Mouselistener,我在JPanel中有5个jlabel,它位于JFrame中。我正在使用一个for循环添加JLabels,该循环通过一个颜色数组进行迭代: private JLabel target; // This is the origin of the first label added. Point origin = new Point(10, 20); // This is the offset for computing the origin for the next label. int off

我在
JPanel
中有5个
jlabel
,它位于
JFrame
中。我正在使用一个for循环添加
JLabels
,该循环通过一个颜色数组进行迭代:

private JLabel target;

// This is the origin of the first label added.
Point origin = new Point(10, 20);

// This is the offset for computing the origin for the next label.
int offset = 200;

for (int i = 0; i < layerColors.length; i++) {
    target = createColoredLabel(layerColors[i], origin, targetIcon);
    layeredPane.add(target, new Integer(i));
    origin.x += offset;
}

// Create and set up a colored label with icon image.
private JLabel createColoredLabel(Color color, Point origin, ImageIcon icon) {
    JLabel label = new JLabel(icon);
    label.setVerticalAlignment(JLabel.TOP);
    label.setHorizontalAlignment(JLabel.CENTER);
    label.setOpaque(true);
    label.setBackground(color);
    label.setBorder(BorderFactory.createLineBorder(Color.black));
    label.setBounds(origin.x, origin.y, 175, 263);
    label.addMouseListener(this);

    return label;
}
这将创建5个
jLabel
,并为每个标签指定相同的
ImageIcon
,水平分布在
JPanel
上。每个标签都添加了一个
mouseStener
,但只有最后添加的标签才会触发事件

@Override
public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(target)) {
        Toolkit.getDefaultToolkit().beep();
    }
}
我有一个次要问题,涉及一个标签,其中包含一个跟踪光标的
ImageIcon
,当我将鼠标悬停在5个标签中的任何一个上时,光标就会停止。我想这是一个层索引问题,但无法解决它

非常感谢您的帮助,谢谢

您的
mouseClicked(MouseEvent evt)
方法只检查事件源是否是单个组件(目标),正如Geoffrey指出的,这是您添加的最后一个标签。尝试将其添加为
mouseClicked
方法的第一行

System.out.println("Color: " + ((JLabel)evt.getSource()).getBackground());
注:未经测试。希望颜色有一个很好的toString()实现。

注2:如果将类作为鼠标侦听器添加到任何其他组件中,则可能会得到一个
ClassCastException

到底是什么问题?您的鼠标侦听器仅在单击最后一个标签时发出嘟嘟声,因为这是您设置的目标。顺便说一句,代码远非SSCCE。为质量低劣的代码道歉——我刚刚开始软件开发。我现在明白我逻辑上的缺陷了,谢谢。关于如何引用它以使任何标签在单击时都会发出嘟嘟声,您有什么想法吗?请去掉
e.getSource().equals(target)
部分,或者存储一个JLabel数组并循环检查它们是否是目标。根据您的建议,将我的事件方法更改为迭代JLabel数组。谢谢