Массив кнопок - 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);
}
}