Связывать одно событие со всеми JLabels в Java

У меня есть 20 JLabels и все они должны изменить свой цвет фона, когда мышь входит и возвращается обратно к исходному цвету при выводе мыши.

Нужно ли индивидуально связывать 2 Event-listeners MouseEntered и MouseExited со всеми JLabel отдельно, или есть какая-либо работа, поэтому я могу сделать всего 2 события, отслеживая все JLabel?

Как на изображении ниже: есть около 6 JLabels и я хочу, чтобы каждый из них менял свой цвет фона всякий раз, когда мышь входит в сцену и возвращается обратно к исходному цвету при выводе мыши.

Итак, нужно ли индивидуально настраивать прослушиватели событий на всех JLabels, или может быть один прослушиватель событий для всех JLabels?

4 ответа

Вы можете зарегистрировать все 20 JLabels с тем же самым прослушивателем мыши. Вы бы сделали что-то вроде этого:

MouseListener m = new MouseAdapter() // create our own mouse listener
{
 @Override
 public void mouseEntered(MouseEvent e) 
 {
 e.getComponent().setBackground(Color.RED);; // this method changes the colours of all the labels
 }
 @Override
 public void mouseExited(MouseEvent e)
 {
 e.getComponent().setBackground(Color.GREEN); // this method changes the colours back to normal
 }
};
for (JLabel label: labels) // iterate over all the labels
{
 label.addMouseListener(m); // give them all our mouse listener
}

Где "метки" - это некоторая коллекция (List, Set, array...) ваших JLabels, а changeLabelColours() и changeLabelColoursBack() - это два метода, которые вы определяете для изменения цветов.

надеюсь это поможет!

EDIT: прочитав ваш отредактированный вопрос, я думаю, я должен указать, что этот код заставит ВСЕ ярлыки менять цвет, когда ЛЮБОЙ из меток затуманивается. Я думаю, что ты имеешь в виду.


Вы не совершаете события. Вы делаете eventListeners. И да, вы можете сделать всего 2 прослушивателя событий и связать их со всеми JLabel.

Или, если вы предпочитаете, вы можете Jlabel в MyJlabel, у которого есть встроенный прослушиватель событий, и избавиться от повторной привязки, если это вас беспокоит.


Обратите внимание, что метки должны быть непрозрачными, чтобы изменить их цвет bg.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.BoxLayout;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;


public class CrazyLabels extends JFrame {

 public CrazyLabels() {
 setDefaultCloseOperation(EXIT_ON_CLOSE);
 setLayout(new BorderLayout());
 JPanel content = new JPanel();
 add(content);
 content.setLayout(new BoxLayout(content, BoxLayout.Y_AXIS)); 

 MouseAdapter listener = new MouseAdapter() {

 @Override
 public void mouseEntered(MouseEvent e) {
 JLabel label = (JLabel)e.getSource();
 label.setBackground(Color.red);
 }

 @Override
 public void mouseExited(MouseEvent e) {
 JLabel label = (JLabel)e.getSource();
 label.setBackground(UIManager.getColor("Label.background"));
 }

 };

 for (int i = 0; i < 5; i++) {
 JLabel label = new MyLabel(listener);
 label.setText("---- label ----");
 content.add(label);
 }

 pack();
 setLocationRelativeTo(null);
 }

 public static void main(String[] args) {
 SwingUtilities.invokeLater(new Runnable() {

 public void run() {
 new CrazyLabels().setVisible(true);
 }
 });
 }

 private static class MyLabel extends JLabel {
 public MyLabel(MouseListener listener) {
 setOpaque(true);
 addMouseListener(listener);
 }
 }
}

В этом примере один прослушиватель используется для обеспечения поведения во всех ярлыках.


Вы можете использовать одну ссылку MouseListener.

Вы должны различать источники событий на основе ссылок или имени компонента.

Вот пример

final JLabel label1 = new JLabel("label1");
label1.setName("label1");
final JLabel label2 = new JLabel("label2");
label2.setName("label2");
final JLabel label3 = new JLabel("label3");
label3.setName("label3");

MouseListener mouseListener = new MouseAdapter() {

 @Override
 public void mouseExited(MouseEvent e) {
 // you can check references
 if(e.getSource() == label1) {
 System.out.println("exited " + label1.getName());
 } else if (e.getSource() == label2) {
 System.out.println("exited " + label2.getName());
 } else if (e.getSource() == label3) {
 System.out.println("exited " + label3.getName());
 }
 }

 @Override
 public void mouseEntered(MouseEvent e) {
 String name = ((JComponent)e.getSource()).getName();
 // or you can check name of component
 switch (name) {
 case "label1":
 case "label2":
 case "label3":
 System.out.println("entered " + name);
 break;
 }
 }
};
for (JLabel l : Arrays.asList(label1, label2, label3)) {
 l.addMouseListener(mouseListener);
}

licensed under cc by-sa 3.0 with attribution.