Страницы

Поиск по вопросам

воскресенье, 16 февраля 2020 г.

Не удаляются контролы, созданные в цикле

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

Комментариев нет:

Отправить комментарий