将单个事件绑定到Java中的所有JLabel

时间:2014-09-12 12:33:17

标签: java swing events

我有20 JLabels,所有这些都必须在鼠标进入时更改其背景颜色,并在鼠标输出时更改为原始颜色。

我是否必须单独绑定MouseEnteredMouseExited的2个事件监听器与所有JLabel分别绑定,或者是否有任何解决方法,因此我只能制作2个事件类型监控所有JLabel s?

如下图所示:大约有6 JLabels,我希望每当鼠标进入场景时每个都改变它的背景颜色,并在鼠标移出时改回原始颜色。

enter image description here

那么,我是否必须在所有JLabels上单独设置事件侦听器,或者所有JLabels都可以有一个事件侦听器?

4 个答案:

答案 0 :(得分:2)

您可以使用相同的鼠标侦听器注册所有20个JLabel。你会做这样的事情:

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
}

其中"标签"是JLabel的一些集合(List,Set,array ...),changeLabelColours()和changeLabelColoursBack()是您定义的两种更改颜色的方法。

希望这有帮助!

编辑:阅读您编辑过的问题,我想我应该指出,当 ANY 标签被鼠标悬停时,此代码会导致所有标签改变颜色。我认为这就是你的意思。

答案 1 :(得分:0)

你没有做过活动"。你创建了eventListeners。是的,你只能做2个事件监听器并将它们绑定到所有JLabel

或者,如果您愿意,可以将Jlabel扩展为内置事件监听器的MyJlabel,如果困扰您,可以避免重复绑定。

答案 2 :(得分:0)

您可以使用一个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);
}

答案 3 :(得分:0)

请注意,标签必须为opaque才能更改其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);
        }
    }
}

在此示例中,单个侦听器用于强制执行所有标签中的行为。