Hi Leute,
ich habe mir nach Vorlage des Tutorials für editierbare Zellen von hier folgende Klasse gebastelt und diese in meiner TableView eingebunden.
Ich hab die EditingCell Klasse an meine entsprechenden Bedürfnisse angepasst
Eingesetzt hab ich das in meinen Code folgendermaßen:
Was hier passieren soll, ist folgendes:
Wenn ich eine der editierbaren Zellen in meinem Table anklicke, will ich auf Tastendruck "Tab" in die nächste editierbare Zelle springen. Das hatte ich als echt harte Nuss rausgestellt, aber das klappt soweit. (Aber wenn jemand eine schönere Lösung sieht, bitte immer her damit, da ich mit dieser ziemlich unzufrieden bin...)
Das Problem was ich jetzt habe ist, dass sich die Werte in meinen Zellen nicht zuverlässig ändern. Das erste mal klappt es den Wert zu ändern. Ab dem zweiten Versuch klappt es nur noch sporadisch und in der Spalte mit Index 2 klappt es gar nicht, obwohls ja genau dasselbe ist... Wenn ich die Zelle editiere, will ich einfach auf Enter drücken und zack wird mein Wert angezeigt. Aber diese TableView ist so dermaßen widerwillig, dass ich langsam echt die Motivation verliere...
Wäre super, wenn mir da jemand aus der Patsche helfen könnte.
ich habe mir nach Vorlage des Tutorials für editierbare Zellen von hier folgende Klasse gebastelt und diese in meiner TableView eingebunden.
Ich hab die EditingCell Klasse an meine entsprechenden Bedürfnisse angepasst
Java:
import java.util.ArrayList;
import java.util.List;
import javafx.application.Platform;
import javafx.beans.value.ChangeListener;
import javafx.beans.value.ObservableValue;
import javafx.event.EventHandler;
import javafx.scene.Node;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
/**
*
* @author Graham Smith
*/
public class EditingCell<T, String> extends TableCell<T, String> {
private TextField textField;
public EditingCell() {
this.setId("editingCell");
}
@Override
public void startEdit() {
System.out.println("edit");
super.startEdit();
if (textField == null) {
createTextField();
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
Platform.runLater(new Runnable() {
@Override
public void run() {
textField.requestFocus();
textField.selectAll();
}
});
}
@Override
public void cancelEdit() {
System.out.println("cancel");
super.cancelEdit();
setText((java.lang.String) getItem());
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
@Override
public void updateItem(String item, boolean empty) {
System.out.println("update");
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (textField != null) {
textField.setText(getString());
}
setGraphic(textField);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
} else {
setText(getString());
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
}
private void createTextField() {
textField = new TextField( getString() );
textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
textField.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit((String) textField.getText());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
} else if (t.getCode() == KeyCode.TAB) {
commitEdit((String) textField.getText());
TableColumn nextColumn = getNextEditableColumn(!t.isShiftDown());
if (nextColumn != null) {
getTableView().edit(getTableRow().getIndex(), nextColumn);
}
}
}
});
textField.focusedProperty().addListener(new ChangeListener<Boolean>() {
@Override
public void changed(ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) {
if (!newValue && textField != null) {
// commitEdit((String) textField.getText());
}
}
});
}
private java.lang.String getString() {
return getItem() == null ? "" : getItem().toString();
}
/**
*
* @param forward true gets the column to the right, false the column to the left of the current column
* @return
*/
private TableColumn<T, ?>getNextEditableColumn(boolean forward) {
List<TableColumn<T, ?>> columns = new ArrayList();
for (TableColumn<T, ?> column : getTableView().getColumns()) {
columns.addAll(getLeaves(column));
}
//There is no other column that supports editing.
if (columns.size() < 2) {
return null;
}
int currentIndex = columns.indexOf(getTableColumn());
int nextIndex = currentIndex;
if (forward) {
nextIndex++;
} else {
nextIndex--;
}
if (nextIndex < 0 || nextIndex >= columns.size()) {
return null;
} else {
int x = 0;
for (Node editingCell: getTableRow().lookupAll("#editingCell")) {
if (editingCell instanceof EditingCell && x >= nextIndex) {
return columns.get(x);
}
x++;
}
}
return null;
}
private List<TableColumn<T, ?>> getLeaves(TableColumn<T, ?> root) {
List<TableColumn<T, ?>> columns = new ArrayList();
if (root.getColumns().isEmpty()) {
//We only want the leaves that are editable.
if (root.isEditable()) {
columns.add(root);
}
return columns;
} else {
for (TableColumn<T, ?> column : root.getColumns()) {
columns.addAll(getLeaves(column));
}
return columns;
}
}
}
Eingesetzt hab ich das in meinen Code folgendermaßen:
Java:
@FXML
TableView overview;
...
Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn p) {
return new EditingCell();
}
};
TableColumn column = overview.getColumns().get(0);
column.setCellFactory(cellFactory);
column = overview.getColumns().get(2);
column.setCellFactory(cellFactory);
Was hier passieren soll, ist folgendes:
Wenn ich eine der editierbaren Zellen in meinem Table anklicke, will ich auf Tastendruck "Tab" in die nächste editierbare Zelle springen. Das hatte ich als echt harte Nuss rausgestellt, aber das klappt soweit. (Aber wenn jemand eine schönere Lösung sieht, bitte immer her damit, da ich mit dieser ziemlich unzufrieden bin...)
Das Problem was ich jetzt habe ist, dass sich die Werte in meinen Zellen nicht zuverlässig ändern. Das erste mal klappt es den Wert zu ändern. Ab dem zweiten Versuch klappt es nur noch sporadisch und in der Spalte mit Index 2 klappt es gar nicht, obwohls ja genau dasselbe ist... Wenn ich die Zelle editiere, will ich einfach auf Enter drücken und zack wird mein Wert angezeigt. Aber diese TableView ist so dermaßen widerwillig, dass ich langsam echt die Motivation verliere...
Wäre super, wenn mir da jemand aus der Patsche helfen könnte.
Zuletzt bearbeitet: