2017-07-29 10 views
2

Wie Datenänderungen (nicht nur das Hinzufügen/Entfernen, sondern auch Ändern von Eigenschaften von Objekten) in Tableview bevölkert von ObservableList erkennen, welche Objekte mit solchen Eigenschaften enthält:Wie Datenänderungen in Tableview JavaFx erkennen

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(); 

(...) 
} 

Kontroller Klasse das ist, wie ich band sie zusammen:

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()); 
} 

ich versuche, für observableList Methode Zuhörer hinzufügen zu initialisieren, aber leider nur er erkennt, das hinzufügen und Objekte aus der Liste zu löschen. Ich möchte Zuhörer Tableview zu aktualisieren, wenn eine Eigenschaft von Objekt

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(); 
      } 
     } 
     }); 

Ich fand solche sollution im Forum geändert werden, die, wie ich das Hinzufügen nur die erfasst/Entfernen von Objekten

+2

[Erstellen Sie die Liste den richtigen Weg] (https://docs.oracle.com/javase/8/javafx/api/javafx/collec tions/FXCollections.html # observableArrayList-javafx.util.Callback-) oder manuell hinzufügen/entfernen Listener - Ihre Wahl ... Oder führen Sie einfach den gewünschten Code aus, wenn Sie die Eigenschaften ändern ... ('TableColumn.onEditCommit' könnte verwendet werden für editierbare Spalten ...) – fabian

+1

"Ich will Listener aktualisieren TableView immer wenn eine Eigenschaft von Objekt wird geändert werden". Angenommen, Sie haben die Methoden in 'Car' nach dem [üblichen Muster] (http://www.oracle.com/pls/topic/lookup?ctx=javase80&id=JFXBD107) definiert, wird die Tabellenansicht automatisch aktualisiert, wenn sich die Eigenschaften ändern . Es ist nicht notwendig, bereits einen Extraktor zu verwenden oder zusätzliche Listener zu definieren ("PropertyValueFactory") (http://docs.oracle.com/javase/con//javafx/api/javafx/scene/control/cell/PropertyValueFactory.html) Tut die Arbeit für dich. –

Antwort

1

Wenn Sie nur eine Tatsache des veränderten man braucht von Eigenschaften der einfachste Weg wird sein, alle Eigenschaften zu einem ObservableValue zu verbinden.

In Ihrem Car Klasse haben diese Methode:

car.changeProperty().addListener(new ChangeListener() { 
     @Override 
     void changed(ObservableValue observable, Object oldValue, Object newValue) { 
      // one of property was changed, do something 
     } 
    }) 

Auf die gleiche Weise, wenn Sie die Änderungen bei allen Autos erkennen müssen:

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

auf Client-Seite die Sie gerade hören

ObservableValue changeProperty() { 
    return Bindings.concat(car1.changeProperty(), car2.changeProperty(), carN.changeProperty()); 
}