繁体   English   中英

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

[英]Is there a way to simply listen for changes to an object, not what changes were made?

摘要

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

我需要能够知道该对象何时以任何方式更改,以在对象(包括其包含的任何对象)发生任何更改时更新JavaFX ListView。

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

背景

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

几乎所有人似乎都指的是“属性更改侦听器”,以了解对特定“属性/字段”的更改,但是我不需要任何此特定内容。 我只需要知道对象“ 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();
    }

编辑:

我决定尝试可观察者,观察者路线。 现在可以观察到辅助控制器,而主要控制器是观察者。 在辅助服务器中触发某些操作时,主要服务器会更新。 尽管我不能完全确定它可以完成我想做的所有事情,但这是可行的。 我可能会坐下来,然后给相关答案加标签。

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

请参阅ObservableObserver的文档。

您的课程似乎没有任何public领域,对吗? 您是否可以BooleanProperty地向该类添加BooleanProperty并从该类中的任何设置器对其进行更新?

例如:

private BooleanProperty hasChanged = new SimpleBooleanProperty();

然后在您的任何设置器中,更新该属性:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM