javafx erstellen ComboBox TableCell
Ich versuche, erstellen Sie eine benutzerdefinierte TableCell in meinem TableView. Ich möchte es für die Anzeige einer ComboBox, wo ich wählen, können Sie einen String-Wert, und zeigt dann den String-Wert als wenn es wurde eine Benutzer-Eingabe. Die Idee ist, dass dieser user nicht weiß, welches sind die erlaubten Werte, so kann er einfach eine davon auswählen in der ComboBox.
Habe ich versucht zu tun, meine eigenen "ComboBoxCell" aber es funktioniert nicht wie erwartet :
public class ComboBoxCell extends TableCell<ClassesProperty, String> {
private ComboBox<String> comboBox;
public ComboBoxCell() {
}
@Override
public void startEdit() {
super.startEdit();
if (comboBox == null) {
createComboBox();
}
setGraphic(comboBox);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
}
@Override
public void cancelEdit() {
super.cancelEdit();
setText(String.valueOf(getItem()));
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
setGraphic(null);
} else {
if (isEditing()) {
if (comboBox != null) {
comboBox.setValue(getString());
}
setGraphic(comboBox);
setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
} else {
setText(getString());
setContentDisplay(ContentDisplay.TEXT_ONLY);
}
}
}
private void createComboBox() {
//ClassesController.getLevelChoice() is the observable list of String
comboBox = new ComboBox<>(ClassesController.getLevelChoice());
comboBox.setMinWidth(this.getWidth() - this.getGraphicTextGap()*2);
comboBox.setOnKeyPressed(new EventHandler<KeyEvent>() {
@Override
public void handle(KeyEvent t) {
if (t.getCode() == KeyCode.ENTER) {
commitEdit(comboBox.getSelectionModel().getSelectedItem());
} else if (t.getCode() == KeyCode.ESCAPE) {
cancelEdit();
}
}
});
}
private String getString() {
return getItem() == null ? "" : getItem().toString();
}
}
Dann in meinem "Haupt" - app :
levelChoice = FXCollections.observableArrayList(
new String("Bla"),
new String("Blo")
);
//Level Column : String value
Callback<TableColumn, TableCell> comboBoxFactory = new Callback<TableColumn, TableCell>() {
@Override
public TableCell call(TableColumn p) {
return new ComboBoxCell();
}
};
levelColumn.setCellValueFactory(
new PropertyValueFactory<ClassesProperty, String>("level")
);
levelColumn.setCellFactory(comboBoxFactory);
Irgendwelche Ideen?
Danke !
InformationsquelleAutor Jerome | 2014-02-18
Du musst angemeldet sein, um einen Kommentar abzugeben.
Habe ich die Lösung gefunden :
handle
auch:t.getRowValue().setLevel(t.getNewValue());
vermeidet die Besetzung.InformationsquelleAutor Jerome