有没有一种方法可以简单地侦听对象的更改,而不是进行哪些更改?

时间:2019-04-14 23:19:15

标签: java javafx observable fxml changelistener

摘要

我有一个名为“ myClassInstance”的“ MyClass”类型的对象,该对象具有对象的ArrayList。所有包含的对象都实现Serializable接口,并将被写入文件。

只要该对象发生任何更改(包括它包含的任何对象),我就必须知道该对象何时以任何方式更改以更新JavaFX ListView。

基本上,每次“ myClassInstance.hashCode”返回不同的数字时,我希望能够调用一个update方法来更新ui元素。

背景

我一直在寻找解决方案,发现很多页面似乎都有解决方案,但是我忍不住认为这些解决方案似乎都需要对我拥有的模型类进行大量重写,以至于太复杂了。我有问题。

几乎所有的人都似乎指的是Property Change Listeners,以了解对特定Properties / fields的更改,但是我不需要任何特定的内容。我只需要知道对象“ 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 个答案:

答案 0 :(得分:1)

您可以使用Java的Observables。您要监视的对象应该扩展Observable,监视类应该实现Observer

请参阅ObservableObserver的文档。

答案 1 :(得分:1)

您的班级似乎没有任何public字段,对吗?您是否可以不简单地向班级添加BooleanProperty并从班级中的任何设置员进行更新?

例如:

private BooleanProperty hasChanged = new SimpleBooleanProperty();

然后在您的任何二传手中,更新该属性:

public void setData(String data) {
    this.data = data;
    this.hasChanged.set(true);
}