Сводка
У меня есть объект типа "MyClass" с именем "myClassInstance", у которого есть ArrayList объектов.Все содержащиеся объекты реализуют интерфейс Serializable и будут записаны в файл.
Мне нужно знать, когда этот объект изменился каким-либо образом, чтобы обновлять JavaFX ListView при любых изменениях объекта (включаялюбые объекты, которые он содержит).
Практически в любое время, когда myClassInstance.hashCode возвращает другое число, я хочу иметь возможность вызывать метод обновления для обновления элементов пользовательского интерфейса.
Фон
У меня естьЯ искал решение этой проблемы и нашел много страниц, которые, кажется, имеют решения, однако я не могу помочь, но думаю, что эти решения, которые, кажется, требуют значительного переписывания классов моделей, которые у меня есть, слишком сложны для моей проблемы.
Почти все, кажется, обращаются к прослушивателям изменения свойств, чтобы знать об изменениях определенных свойств / полей, но мне не нужно ничего такого специфического.Мне просто нужно знать, был ли изменен объект "myClassInstance".Изменено ли значение, возвращаемое myClassInstance.hashCode.Не, если какое-либо из свойств изменилось, или если свойства объектов, которые это содержит, изменились, но если что-то в "myClassInstance" изменилось.
Соответствующие фрагменты кода
Класс, который должен соблюдаться:
public class myClass implements Serializable {
private ArrayList<SpecificObjectType> myObjects = new ArrayList<>();
public myClass () {
newSpecificObjectType(); //creates default specific object type
}
// Classes related to changing, retrieving or deleting elements of myObjects
}
FXMLMainDocument.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.ListView?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" "package.FXMLMainController">
<center>
<ListView fx:id="listViewObjects" BorderPane.alignment="CENTER" />
</center>
<top>
<Button fx:id="editButton" onAction="#handleEditAction" mnemonicParsing="false" text="Edit" BorderPane.alignment="CENTER" />
</top>
</BorderPane>
FXMLEditDocument.fxml:
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.TextField?>
<?import javafx.scene.layout.BorderPane?>
<BorderPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="package.FXMLEditController">
<center>
<TextField fx:id="edit" onAction="#handleNameTextField" promptText="This Edits The Name of One of the Objects in MyClass's ArrayList" BorderPane.alignment="CENTER" />
</center>
</BorderPane>
FXMLMainController:
@FXML
private ListView listViewObjects;
private MyClass myClassInstance;
private ObservableList<String> obsObjects;
...
public void update() {
this.obsObjects.setAll(myClassInstance.getMyObjectNames());
}
@Override
public void initialize(URL url, ResourceBundle rb) {
this.myClassInstance = new MyClass();
obsObjects = FXCollections.observableArrayList(myClassInstance.getMyObjectNames());
this.listViewObjects.setItems(obsObjects);
update();
}
Редактировать:
Я решил попробовать маршрут Observable, Observer.Вторичный контроллер теперь является наблюдаемым, а основной - наблюдателем.Когда определенные действия вызваны на вторичном, первичные обновления.Это работает, хотя я не совсем уверен, что он может делать все, что я хочу.Возможно, я расскажу об этом, после чего я назову соответствующий ответ.