我有20 JLabels
,所有这些都必须在鼠标进入时更改其背景颜色,并在鼠标输出时更改为原始颜色。
我是否必须单独绑定MouseEntered
和MouseExited
的2个事件监听器与所有JLabel
分别绑定,或者是否有任何解决方法,因此我只能制作2个事件类型监控所有JLabel
s?
如下图所示:大约有6 JLabels
,我希望每当鼠标进入场景时每个都改变它的背景颜色,并在鼠标移出时改回原始颜色。
那么,我是否必须在所有JLabels
上单独设置事件侦听器,或者所有JLabels
都可以有一个事件侦听器?
答案 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);
}
}
}
在此示例中,单个侦听器用于强制执行所有标签中的行为。