2016-07-05 14 views
1
eine Spalte Wert in javafx zu bearbeiten

Ich habe eine TableView, die ihre Artikel Eigenschaft zu einer Klasse gebunden hat Group ‚s applications Eigenschaft, die erklärt, wie:Tableview alle Zeilen ändern, wenn ich versuche

ObjectProperty<ObservableList<Application>> applications = new SimpleObjectProperty(); 

es ist initialisiert als:

applications.set(new FXCollections.observableArrayList<Application>()); 
applications.get().add(new Application()); 
applications.get().add(new Application()); 

Die Klasse Application Klasse einige Eigenschaften und eine andere Klasse Customer deklariert und initialisiert als enthält:

ObjectProperty<Customer> customer = SimpleObjectProperty<>(new Customer()); 

Jetzt gibt es vier Spalten in der TabelleView, die bearbeitet werden können, sie sind 'ApplicationNo', 'ApplicationDate', 'CustomerId' und 'CustomerName'. Die Zellenwertfactory der ersten 2 Spalte ist auf Application Klasse applicationNo und applicationDate Eigenschaften festgelegt. und die Zellwertfactory der letzten 2 Spalte wird auf die Eigenschaften customerId und customerName der Application Klasse festgelegt. Alle vier Spalten können mit dem Combobox-Steuerelement bearbeitet werden, das mit Werten aus der Datenbank gefüllt wird.

Zusätzlich zu der oben genannten Tabellenansicht, habe ich ein Formular in der FXML bestehend aus Feldern, die dort in der Application Klasse und der Customer Klasse sind. Dieses Formular ist deaktiviert, wenn keine Tabellenzeile ausgewählt ist, und wird mit den Werten der Application-Instanz aktiviert, wenn eine der Tabellensichtzeilen ausgewählt ist.

Jetzt ist mein Problem, wenn ich irgendeine Reihe auswähle und die Werte im Formular oder in der Tabelle redigiere, erreichen alle Reihe den neuen Wert, den ich einführe.

Ich lade den Code nicht hoch, weil er sehr lang ist.

der Code für updateItem Methode der Tabellenzelle Editor

protected void updateItem(T item, boolean empty) { 
    super.updateItem(item, empty); 
    if (isEmpty()) { 
     setText(null); 
     setGraphic(null); 
    } else { 
     if (isEditing()) { 
      if (control != null) { 
       updateControl(); 
      } 
      setGraphic(control); 
      setContentDisplay(ContentDisplay.GRAPHIC_ONLY); 
     } else { 
      setText(getItemText()); 
      setGraphic(null); 
      setContentDisplay(ContentDisplay.TEXT_ONLY); 
     } 
    } 

-Code für Zellfabrik und Zellenwert Fabrik der Spalte applicationNo

applicationNo.setCellValueFactory(
      new Callback<TableColumn.CellDataFeatures<GroupRow, ApplicationModel>, ObservableValue<ApplicationModel>>() { 
//GroupRow is the object that contains the Application object 
       @Override 
       public ObservableValue<ApplicationModel> call(CellDataFeatures<GroupRow, ApplicationModel> param) { 
        return param.getValue().getApplicationProperty(); 
       } 
      }); 
    applicationNo.setCellFactory(
      new Callback<TableColumn<GroupRow, ApplicationModel>, TableCell<GroupRow, ApplicationModel>>() { 

       @Override 
       public TableCell<GroupRow, ApplicationModel> call(TableColumn<GroupRow, ApplicationModel> param) { 
        return new ApplicationTableCellEditor(); 
//ApplicationTableCellEditor is custom TableCell 
       } 
      }); 
    applicationNo.setOnEditCommit(new EventHandler<TableColumn.CellEditEvent<GroupRow, ApplicationModel>>() { 

     @Override 
     public void handle(CellEditEvent<GroupRow, ApplicationModel> event) { 
      event.getRowValue().setApplication(event.getNewValue()); 
      tableChanged(); 
      applicationChanged(event.getNewValue()); 
     } 
    }); 
+0

Haben Sie das 'setItem' oder' updateItem' Ihrer Tabellenzelle überschrieben?Können Sie zumindest die Teile zur Verfügung stellen, die Zellenfabriken und Zellenwertfabriken einstellen? – Itai

+0

@sillyfly Ich habe das 'updateItem' in der Tabellenzelle überschrieben. Ich habe die Details der 'updateItem' Methode hochgeladen – Blip

+0

@sillyfly Ich habe den Code für die Zellfabrik und cellvaluefactory für die Spalte' applicationNo' hinzugefügt. – Blip

Antwort

0

Eigentlich habe ich das eigentliche Problem herausgefunden und seine Lösung. Row Auswahl zum Ändern I wurde unter Verwendung von:

tableView.getSelectionModel().selectedItemProperty().addListener(.....); 

Dieser eigentlich, wenn ich die 2. Reihe ausgewählt, nachdem die erste Reihe der Auswahl, da beide die Zeilen enthalten und gleiche Instanz von Application in row1.equals(row2) führt, die wiederum nicht die oben Zuhörer zuließ feuern. Das Entbinden von Werten ist also nie erfolgt und hat zur Folge, dass die Steuerelemente an beide Zeilen gebunden bleiben.

So als Lösung änderte ich die oben:

tableView.getSelectionModel().selectedIndexProperty().addListener(......); 

Hier ist diese jedes Mal, feuerte ich eine andere Zeile dadurch unbinding die Kontrollen und die Eigenschaften der vorherigen Reihe ausgewählt und Bindung der Kontrollen an den Eigenschaften die neue Reihe. Das hat mein Problem gelöst. Ich würde bitten Wenn jemand andere Vorschläge hat, bitte posten Sie die Antwort.