У меня есть несколько панелей и холстов JavaFX, которые ссылаются на сложный объект с необходимыми данными, и я хочу, чтобы они перерисовывались при изменении объекта.Как сделать сложный объект наблюдаемым
Это вызовет объект для наблюдения, но какой класс я использую? В JavaFX, по-видимому, в основном есть подклассы ObservableValue, которые переносят значение и позволяют его заменять. Я не хочу менять сложный объект, просто уведомляю слушателей, когда происходят изменения. Я мог бы это сделать, реализовав addListener
, но я уверен, что есть подкласс, который делает это для меня уже.
class ComplexObject /* extends SomeObservableClass */ {
public int getValue1 { complex calculations... };
public int getValue2 { ... };
public void setNewValue1(int newValue) { ... }
}
class ComplexRenderer extends Canvas implements InvalidationListener {
private ComplexObject complexObject;
public void setComplexObject(ComplexObject complexObject) {
this.complexObject = complexObject;
complexObject.addListener(this);
}
public void draw() { ... }
}
В каком классе должен применяться ComplexObject? Есть ли что-то, что поддерживает список слушателей и что-то вроде fireValueChangedEvent(), чтобы я мог сообщить об этом всем слушателям?
Все, что я вижу в JavaFX, похоже, ориентировано на свойства, которые здесь не кажутся правильными.
Не совсем уверен, что вы подразумеваете под «не поменять». Я не уверен, если вы имеете в виду подделку всего «ComplexObject» или, возможно, некоторые значения внутри него. Нужно ли выполнять вычисления для 'getValue()' только при его вызове? Или он может быть рассчитан и сохранен до того, как он будет вызван? – Jai
«Невозможно поменять» означает, что я хочу сохранить тот же «ComplexObject», просто изменив значения внутри него. Мне кажется, что «ObjectPropertyBase» и его друзья предназначены для обертки, поэтому вы заменяете весь объект с помощью 'set()', который затем запускает прослушиватели недействительности. Я мог хранить сложные вычисления и показывать результаты как индивидуальные свойства, но первоначальное намерение состояло в том, чтобы просто иметь сложный объект и выполнять вычисления по требованию. – EboMike
Это означает, что мой ответ должен быть близок к тому, что вы ищете. Вы не отслеживаете изменение в ссылке «ComplexObject». Вместо этого вы отслеживаете изменение ссылок на свои внутренние значения (примитивы должны быть в коробке) и объекты. Если вам нужно отслеживать индивидуальное свойство, вам нужно добавить к ним индивидуальный слушатель. В противном случае вы можете выставить 'BooleanProperty', чтобы вы могли прослушивать любые изменения в любом из свойств. Конечно, внутренне вы должны привязать эти свойства к 'BooleanProperty'. – Jai