Массив кнопок - Java

Узнай цену своей работы

Формулировка задачи:

Попробую свести задачу к минимуму. Есть кнопка "добавить", которая создает новую кнопку. Соответственно, добавлять кнопок можно сколько угодно. В итоге получается массив кнопок (кнопка "добавить" к нему не относится). Так вот, мне нужно, чтобы при нажатии на любую из кнопок этого массива, она удалялась. Вроде бы не сложно, но видимо я что-то до конца не понимаю и не могу правильно реализовать. Максимум что получилось - удаление последней добавленной кнопки, причем не важно на какую нажимаешь, а после этого отклик вообще теряется и ничего не происходит при нажатии на любую кнопку. Ниже приведен метод, в котором по идее для каждой кнопки должен настраиваться свой обработчик событий. В целом, я понимаю в чем проблема, видимо на все кнопки получается один обработчик событий, а после удаления кнопки, обработчик тоже удаляется, и остаются только старые кнопки, которые ничего не делают. Так вот вопрос в том, как сделать так, чтобы у каждой кнопки был свой личный обработчик событий, но чтобы при этом не настраивать каждую кнопку отдельно, разумеется.
private HBox task;
private TextField nameOfTask;
private Button closePageButton;
 
public HBox newTask() {
        task = new HBox();
        nameOfTask = new TextField();
        closePageButton = new Button("X");
        closePageButton.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                task.getChildren().remove(closePageButton);
            }
        });
        task.getChildren().addAll(nameOfTask, closePageButton);
        return task;
    }

Решение задачи: «Массив кнопок»

textual
Листинг программы
public class SelfDelButtons extends JFrame implements ActionListener {
 
    private int counter;
    private JPanel jp = new JPanel();
    private ArrayList<JButton> list = new ArrayList<>();
 
    SelfDelButtons() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setSize(700, 100);
        add(jp);
        JButton button = new JButton("Primary Button");
        button.addActionListener(this);
        jp.add(button);
    }
 
    @Override
    public void actionPerformed(ActionEvent e) {
        if (e.getActionCommand().equals("Primary Button")) {
            counter++;
            JButton nb = new JButton("Button " + counter);
            nb.addActionListener(this);
            jp.add(nb);
            list.add(nb);
        } else {
            findAndDelButton((JButton) e.getSource());
        }
        jp.revalidate();
    }
 
    void findAndDelButton(JButton b) {
        for (Iterator<JButton> iterator = list.iterator(); iterator.hasNext(); ) {
            JButton i = iterator.next();
            if (i.equals(b)) {
                iterator.remove();
                jp.remove(i);
                break;
            }
        }
    }
 
    public static void main(String[] args) {
        JFrame window = new SelfDelButtons();
        window.setVisible(true);
    }
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 3.818 из 5