#java
Путем цикла я создала метки. Мне нужно, чтобы, когда я кликну на них мышкой, они
исчезали. Кликнула на одну, она исчезла, на другую и так далее. Но, когда я запускаю,
метки не пропадают. Что нужно сделать, чтобы все работало так, как надо?
lol = new JPanel();
lol.setBounds(10, 47, 974, 693);
contentPane.add(lol);
lol.setLayout(null);
for (int k = 0; k < 50; k++){
label_2 = new JLabel("");
label_2.setIcon(new ImageIcon(P.class.getResource("/images/00.png")));
int w = randomRange(10, 974);
int r = randomRange(10, 693);
label_2.setBounds(w, r, 200, 200);
label_2.addMouseListener(new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
lol.remove(label_2);
}
});
lol.add(label_2);
}
Ответы
Ответ 1
lol.remove((JLabel)e.getComponent()); или lol.remove((JLabel)e.getSource());Ответ 2
И вариант с циклом для полноты картины: for (int k = 0; k < 50; k++) { JLabel label_2 = new JLabel("Label" + k); label_2.addMouseListener(new MouseAdapter() { @Override public void mouseClicked(MouseEvent e) { lol.remove(label_2); } }); lol.add(label_2); } Разница в том, что переменная label_2 объявляется внутри цикла, а не снаружи. Поэтому во внутреннем классе используется метка из текущей итерации, а не последняя из созданных. После lol.remove(label_2); в обработчик события можно добавить frame.repaint();, если отсутствует постоянная отрисовка в цикле.Ответ 3
Проблема в замыкании, а именно в этой строчке: lol.remove(label_2); Когда цикл завершается, в переменной label_2 находится последняя поставленная метка. Когда отрабатывает событие клика, то удаляется только эта последняя метка. Вам нужно изменить способ удаления (а точнее, способ получения нужного экземпляра метки)
Комментариев нет:
Отправить комментарий