MouseListener на нескольких JLabel не работает, как задумано - PullRequest
1 голос
/ 13 сентября 2010

У меня есть 5 JLabels внутри JPanel внутри 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 меток. Я полагаю, что это проблема индексации слоев, но я не могу ее решить.

Любая помощь с этим очень ценится, спасибо!

1 Ответ

2 голосов
/ 13 сентября 2010

Ваш метод mouseClicked(MouseEvent evt) только проверяет, был ли источник события единственным компонентом (целью), который, как указывает Джеффри, является последней добавленной вами меткой.Попробуйте добавить это в качестве первой строки в вашем методе mouseClicked.

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

Примечание: не проверено.Надеюсь, у Color есть хорошая реализация toString ().
Примечание 2: Вы можете получить ClassCastException, если добавите класс в качестве прослушивателя мыши для любого другого компонента.

...