Дублированные дочерние элементы JavaFX добавлены при удалении

У меня довольно странная проблема с javafx. Если я добавлю несколько прямоугольников в якорную панель, а затем удалю их, я получу следующее исключение:

java.lang.IllegalArgumentException: Children: добавлены повторяющиеся дочерние элементы: parent = AnchorPane

Но теперь проявляется настоящая проблема: исключение совершенно случайное. Итак, я не всегда получаю исключение, когда удаляю прямоугольник, и это то, чего я не понимаю. Я уже все отладил, но нет никакой разницы между "завершением без исключений" и "завершением с исключением" (надеюсь, кто-то поймет мое странное письмо xd) Другая проблема в том, что я не знаю, как воспроизвести эту проблему. Это на 100% моя вина, но я не могу сказать, что я делаю не так.

Теперь моя последняя попытка - задать вопрос здесь. Есть ли у кого-нибудь советы для этого исключения? (Я использую новейшую версию IntelliJ и JDK17 + JavaFX 17)

Класс прямоугольника/узла:

import javafx.beans.property.SimpleStringProperty;
import javafx.scene.shape.Rectangle;
import java.text.DecimalFormat;
import java.util.Objects;

public class MyNode extends Rectangle {

    private int myNodeId;
    private SimpleStringProperty myNodeIdProperty;
    private DecimalFormat threeDigits;

    public MyNode() {

    }

    public MyNode(double xCord, double yCord, double width, double height, int myNodeId) {
        super(xCord, yCord, width, height);

        this.myNodeId = myNodeId;

        threeDigits = new DecimalFormat("000");

        this.myNodeIdProperty = new SimpleStringProperty();
        this.myNodeIdProperty.set(threeDigits.format(myNodeId));
    }

    public int getMyNodeId() {
        return myNodeId;
    }

    public void setMyNodeId(int myNodeId) {
        this.myNodeIdProperty.set(threeDigits.format(myNodeId));
        this.myNodeId = myNodeId;
    }

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        MyNode myNode = (MyNode) o;
        return myNodeId == myNode.myNodeId;
    }

    @Override
    public int hashCode() {
        return Objects.hash(myNodeId);
    }
}

Может быть, кто-то уже видит странную вещь в моем классе узлов. Как видите, у меня есть уникальный идентификатор и свойство для привязки этого идентификатора к ячейке таблицы. Я добавляю и удаляю узлы с помощью следующего кода:

anchorPane.getChildren().add(myNode);
anchorPane.getChildren().remove(myNode);

Жду ваших ответов. Спасибо.

Предоставьте минимальный воспроизводимый пример.

jewelsea 25.11.2022 22:01

Вам не нужно собственное свойство id, оно уже есть у всех нод. Также ваше другое пользовательское поле threeDigits не используется и не отображается. Так что здесь нет необходимости расширять Rectangle.

jewelsea 25.11.2022 22:03

Я знаю, что каждый узел уже имеет свой собственный идентификатор, но они связаны с CSS, и мне нужны свои собственные уникальные идентификаторы.

Jaster_Master 25.11.2022 22:08

Я бы посчитал переопределение equals / hashCode для подкласса Node «неправильным». Учитывая, как работает JavaFX, вопрос о том, является ли узел «дубликатом», действительно должен основываться на идентичности объекта. Я не знаю, связано ли это с вашей проблемой; было бы лучше предоставить правильный минимально воспроизводимый пример, демонстрирующий исключение. Но если это связано с вашей проблемой, я бы рекомендовал создать модель и реорганизовать идентификатор (и, возможно, даже форматирование). Затем просто «сопоставьте» объекты вашей модели с уникальными Rectangle объектами (нет необходимости в подклассах).

Slaw 25.11.2022 22:16

Вы правы... Я удалил переопределения, и теперь все работает нормально. Спасибо за помощь. Я потратил на это часы. Я также ИЗМЕНИЛ метод equals, но не пытался его удалить. Спасибо.

Jaster_Master 25.11.2022 22:38
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в переопределении методов equals и hashcode... Я удалил их, и теперь все работает нормально. Спасибо @Slaw.

Другие вопросы по теме