当前位置: 首页 > 知识库问答 >
问题:

如何在tableView JavaFx中检测数据更改

窦彦君
2023-03-14
public class Car{
private SimpleIntegerProperty id = new SimpleIntegerProperty();
private SimpleStringProperty brand = new SimpleStringProperty();
private SimpleStringProperty engine = new SimpleStringProperty();
private SimpleBooleanProperty navi = new SimpleBooleanProperty();
private SimpleBooleanProperty available = new SimpleBooleanProperty();
private SimpleDoubleProperty liters = new SimpleDoubleProperty();
private SimpleIntegerProperty power = new SimpleIntegerProperty();

(...)
}
class MainController
{

@FXML
public void initialize()
{

    idColumn.setCellValueFactory(new PropertyValueFactory<Car, Integer>("id"));
    engineColumn.setCellValueFactory(new PropertyValueFactory<Car, String>("engine"));
    brandColumn.setCellValueFactory(new PropertyValueFactory<Car, String>("brand"));
    naviColumn.setCellValueFactory(new PropertyValueFactory<Car, Boolean>("navi"));
    availableColumn.setCellValueFactory(new PropertyValueFactory<Car, Boolean>("available"));
    powerColumn.setCellValueFactory(new PropertyValueFactory<Car, Integer>("power"));
    fuelColumn.setCellValueFactory(new PropertyValueFactory<Car, Double>("liters"));
    carModel.getObservableList().add(new Car(213,"FIAT","1.9 JTD",true,true,32.4,132));
    tableView.setItems(carModel.getObservableList());
 }
carModel.getObservableList().addListener((Change<? extends Car> c) -> {
         while (c.next()) {
             if (c.wasAdded()) {
                 System.out.println("Added:");
                 c.getAddedSubList().forEach(System.out::println);
                 System.out.println();
             }
             if (c.wasRemoved()) {
                 System.out.println("Removed:");
                 c.getRemoved().forEach(System.out::println);
                 System.out.println();
             }
             if (c.wasUpdated()) {
                 System.out.println("Updated:");
                 carModel.getObservableList().subList(c.getFrom(), c.getTo()).forEach(System.out::println);
                 System.out.println();
             }
         }
      });

我在论坛上发现了这样的sollution,正如我所说的,它只检测添加/删除对象

共有1个答案

梁新觉
2023-03-14

如果只需要更改一个属性的事实,最简单的方法是将所有属性连接到一个ObservableValue中。

CAR类中,请使用以下方法

ObservableValue changeProperty() {
    return Bindings.concat(id, brand, engine, navi, available, liters, power);
}

在客户端,您只需收听:

    car.changeProperty().addListener(new ChangeListener() {
        @Override
        void changed(ObservableValue observable, Object oldValue, Object newValue) {
            // one of property was changed, do something
        }
    })
ObservableValue changeProperty() {
    return Bindings.concat(car1.changeProperty(), car2.changeProperty(), carN.changeProperty());
}
 类似资料:
  • 问题内容: 我正在使用以下聚合: 这有效,但是我只会得到无用的聚合-我也必须与… 相处 问题答案: 如果您想获取该ID的类别名称, 因此,子聚合(嵌套在上面)为您提供了id的categoryName。

  • 这个代码段总是执行else部分,所以我想等到变量从数据库中获取值后再执行。

  • 问题内容: 在Netbeans中,我使用了GUI Builder将JTable插入到我的应用程序中。 到目前为止,我只有一个类(CustomerDB): 每当用户更改表中的数据时,我都希望获取该单元格的旧值(可选)和新值。 为了获取此数据,我尝试实现一个事件侦听器: 然后,将此CellEditorListener分配给表(其单元格编辑器): 到目前为止,该方法有效。 但这还无法使我检测到此单元格的

  • 我有一个带有子组件的组件。 在时间轴组件中,我有这些属性: 如何检查何时从时间轴组件对属性进行更改?每当编辑值发生更改时,我都需要发出该值。 我应该为编辑属性使用一个setter,然后从那里发出吗? 或者有其他方法吗?

  • 是否有一种方法可以在每次文件更改时以某种方式触发一个事件?我是指类似的东西(在伪代码中) 我知道我可以周期性地做,但我能在没有计时器的情况下做吗?我希望在用户更新txt文件时(不是通过代码,而是通过打开文件并在里面写入)能够做出一些动作,但我不知道他什么时候会这么做。

  • 问题内容: 我想知道何时失去互联网连接并重新获得互联网,以便可以在显示“糟糕,没有互联网”的警报和包含从我的服务器派生的数据的Google地图或网格之间切换。 这个相关的问题和另一个相关的问题认为他们有答案,但没有答案。 他们的解决方案适用于Chrome版本34.0.1847.137 m,MS IE v11.0.xx,但不适用于FireFox v29.0.1,因此,我正在寻求一种适用于所有这三种浏