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]
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]