У меня довольно странная проблема с 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);
Жду ваших ответов. Спасибо.
Вам не нужно собственное свойство id, оно уже есть у всех нод. Также ваше другое пользовательское поле threeDigits не используется и не отображается. Так что здесь нет необходимости расширять Rectangle.
Я знаю, что каждый узел уже имеет свой собственный идентификатор, но они связаны с CSS, и мне нужны свои собственные уникальные идентификаторы.
Я бы посчитал переопределение equals
/ hashCode
для подкласса Node
«неправильным». Учитывая, как работает JavaFX, вопрос о том, является ли узел «дубликатом», действительно должен основываться на идентичности объекта. Я не знаю, связано ли это с вашей проблемой; было бы лучше предоставить правильный минимально воспроизводимый пример, демонстрирующий исключение. Но если это связано с вашей проблемой, я бы рекомендовал создать модель и реорганизовать идентификатор (и, возможно, даже форматирование). Затем просто «сопоставьте» объекты вашей модели с уникальными Rectangle
объектами (нет необходимости в подклассах).
Вы правы... Я удалил переопределения, и теперь все работает нормально. Спасибо за помощь. Я потратил на это часы. Я также ИЗМЕНИЛ метод equals, но не пытался его удалить. Спасибо.
Проблема заключалась в переопределении методов equals и hashcode... Я удалил их, и теперь все работает нормально. Спасибо @Slaw.
Предоставьте минимальный воспроизводимый пример.