#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 находится последняя поставленная метка. Когда отрабатывает событие клика, то удаляется только эта последняя метка. Вам нужно изменить способ удаления (а точнее, способ получения нужного экземпляра метки)
Комментариев нет:
Отправить комментарий