我正在尝试将几个 JLabels 添加到 JPanel 以及使用循环的鼠标侦听器。这些 JLabel 将具有鼠标侦听器,以便在单击时更改其图标(使用 label.setIcon())。但是,我一次只想“选择”一个。因此,我需要他们知道何时单击了另一个标签,以便它知道在选择新标签之前自行关闭。但是,我的问题是,因为我使用循环添加这些标签,所以它们都具有相同的 MouseListener。
谁能教我一个简单的方法来完成这个?
这是一个简短的示例,您可以如何实现它(请注意,我没有使用图标,而是更改了标签):
public class MouseListenerExample extends JFrame {
public static class MyMouseListener extends MouseAdapter {
private static final Collection<JLabel> labels = new ArrayList<JLabel>();
private final JFrame frame;
public MyMouseListener(JFrame frame, JLabel label) {
this.frame = frame;
labels.add(label);
}
@Override
public void mouseClicked(MouseEvent e) {
for (JLabel label : labels) {
String text = label.getText();
if (text.startsWith("X ")) {
label.setText(text.substring(2));
}
}
JLabel currentLabel = (JLabel) e.getComponent();
currentLabel.setText("X " + currentLabel.getText());
}
}
public MouseListenerExample() {
super("MouseListener Example");
Container c = getContentPane();
c.setLayout(new FlowLayout());
for (int i = 0; i < 10; i++) {
JLabel jLabel = new JLabel("Label " + i);
c.add(jLabel);
jLabel.addMouseListener(new MyMouseListener(this, jLabel));
}
pack();
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
public static void main(String[] args) {
new MouseListenerExample();
}
}
主要思想是,您MouseListener
为每个标签创建一个新标签,但在每个侦听器的范围之外保留一个标签列表(在此示例中,我只使用一个static
变量,但您也可以在框架中拥有一个包含标签列表的字段.