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());
}
});
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
@sillyfly Ich habe das 'updateItem' in der Tabellenzelle überschrieben. Ich habe die Details der 'updateItem' Methode hochgeladen – Blip
@sillyfly Ich habe den Code für die Zellfabrik und cellvaluefactory für die Spalte' applicationNo' hinzugefügt. – Blip