Есть ли способ просто прослушивать изменения объекта, а не какие изменения были сделаны? - PullRequest
0 голосов
/ 15 апреля 2019

Сводка

У меня есть объект типа "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.Вторичный контроллер теперь является наблюдаемым, а основной - наблюдателем.Когда определенные действия вызваны на вторичном, первичные обновления.Это работает, хотя я не совсем уверен, что он может делать все, что я хочу.Возможно, я расскажу об этом, после чего я назову соответствующий ответ.

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

В вашем классе нет полей public, верно? Не могли бы вы просто добавить BooleanProperty в класс и обновить его с помощью любых сеттеров в классе?

Например:

private BooleanProperty hasChanged = new SimpleBooleanProperty();

Затем в любом из ваших сеттеров обновите это свойство:

public void setData(String data) {
    this.data = data;
    this.hasChanged.set(true);
}
1 голос
/ 15 апреля 2019

Вы можете использовать Java Observables. Объект, который вы хотите отслеживать, должен расширяться Observable, а класс мониторинга должен реализовывать Observer.

См. Документацию для Observable и Observer.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...