1

我在 a 里面有 5JLabels个,在 aJPanel里面JFrame。我正在添加JLabels使用 for 循环,该循环遍历颜色数组:

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 个JLabels,每个都分配相同ImageIcon的值,水平分布在JPanel. 每个都有一个MouseListener添加到它,但只有最后一个要添加的标签会触发事件。

@Override
public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(target)) {
        Toolkit.getDefaultToolkit().beep();
    }
}

我有一个涉及包含ImageIcon尾随光标的标签的次要问题,当我将鼠标悬停在 5 个标签中的任何一个上时,该光标会停止。我想这是一个图层索引问题,但无法解决。

非常感谢您对这些的任何帮助,谢谢!

4

1 回答 1

2

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

System.out.println("Color: " + ((JLabel)evt.getSource()).getBackground());

注意:未经测试。希望 Color 有一个很好的 toString() 实现。
注意 2:ClassCastException如果您将该类作为鼠标侦听器添加到任何其他组件,您可能会得到一个。

于 2010-09-13T16:16:58.950 回答