Anbindung Textfeldklasse an Table funktioniert nicht

Joob

Top Contributor
Ich wollte eine TextFeldKlasse in einen Tableview verwenden, aber das commit wirkt sich nicht in der Zelle aus.
Damit will ich sagen das die Änderungen nicht im TableView ankommen und dort in der DatenKlasse gespeichert werden.

Leider kann ich in den OracleDocs keine Lösung finden.
Momentan kann ich in die Zellen schreiben und auch ordentlich bearbeiten, aber wie gesagt die Änderung kommt nicht in der Zelle an um dann
in die Datenklasse geschrieben zu werden.
Ich prüfe das indem ich einen Breakpoint beim Zeilenwechsel im TableView setze und mir dann die Klasse anschaue.

btw: gibt es ein Tuturial was einem den Umgang mit OracleDocs näherbringt

[CODE lang="java" title="Anbindung an die Column"] columnCourse.setCellValueFactory(new PropertyValueFactory<>("CourseName"));
columnCourse.setCellFactory(i -> new CellClassTextFieldString(columnCourse, 20));
columnCourse.setOnEditCommit(e -> { System.out.println("Commit in Controller ");; }); [/CODE]

[CODE lang="java" title="Meine TextFieldKlasse"]public class CellClassTextFieldString<T> extends TableCell<T, String> {

private final TextField textField;
private final int maxLen;

public CellClassTextFieldString(TableColumn<T, String> stringCol, Integer maxLen) {

this.textField = new TextField();
this.maxLen = maxLen;


this.textField.setTextFormatter(new TextFormatter<>(new StringConverter<String>() {

@Override
public String toString(String object) {
if(object == null) return "";

if (object.length() > maxLen) {
return object.substring(0, maxLen);
} else {
return object;
}

}

@Override
public String fromString(String string) {
if(string == null) {
return "";
} else {
if (string.length() > maxLen) {
return string.substring(0,maxLen);
} else {
return string;
}
}
}

}));


// Bind this cells editable property to the whole Column
editableProperty().bind(stringCol.editableProperty());


// configure TextField, sonst schreibt fx zwei mal sieht dann aus wie eine zweite Spalte
contentDisplayProperty().bind(Bindings
.when(editableProperty())
.then(ContentDisplay.GRAPHIC_ONLY)
.otherwise(ContentDisplay.TEXT_ONLY)
);

setListener () ;

}


@Override
protected void updateItem(String strInput, boolean empty) {
System.out.println("updateItem");
super.updateItem(strInput, empty);

if(empty) {

setText(null);
setGraphic(null);

} else {

// Datepicker handel null value
this.textField.setText(strInput);
setGraphic(this.textField);

if(strInput == null) {
setText("");
} else {
setText(strInput);
}
}
}


private void setListener () {

this.textField.focusedProperty().addListener((observable, oldValue, newValue) -> {
if(newValue) {
System.out.println("get focus");
} else {
System.out.println("lost focus");
commitEdit(textField.getText());

}
});

this.textField.textProperty().addListener((observable, oldValue, newValue) -> {

// if(isEditing()) { wird nie true ?
System.out.println("comit : " + newValue + "isEditing : " + isEditing());
if (newValue.length() > maxLen) {
textField.setText(oldValue);
}
});


this.textField.setOnKeyPressed(new EventHandler<KeyEvent>() {

@Override public void handle(KeyEvent evt) {

if (KeyCode.ESCAPE == evt.getCode()) {
System.out.println("cancel edit");
cancelEdit();
}

if (KeyCode.ENTER == evt.getCode() || KeyCode.TAB == evt.getCode() ) {
System.out.println("commit edit");
commitEdit(textField.getText());
}
}
});
}
}[/CODE]
 
Ja, das kenne ich.

Da muss ich aber immer eine innere Klasse verwenden.

Ich würde aber gerne ein allgemeine Klasse für TextFeld erstellen.
Dann kann ich darin die Prüfungen, Länge, Integer usw. prüfen. Die Parameter für die Prüfungen würde ich im Konstruktur mitgeben.
Des Weiteren würde ich gerne das Verhalten beim Eingabetaste, Tab-Taste, ESC - Taste usw. steuern.
Damit der Benutzer sich einfacher in der Tabelle bewegen kann.

Mein Problem ist gerade, das ich nicht weiß warum die Änderungen im TextFeld nicht an die TableCell gegeben werden.

Ich habe etwas ähnliches für den DatePicker gemacht und da war es kein Problem.
 
Ich hab das mal anhand von dem hier (Achtung: Die Klammern < und > sind im Code irgendwie kaputt) in Kotlin für ein spezifisches UI nachgebaut.

Bei mir geht's...
 

Zurück
Oben