javafx创建ComboBox TableCell

我正在尝试在TableView中创建自定义TableCell。 我希望它显示一个ComboBox,我可以在其中选择一个String值,然后显示String值,就好像它是一个用户输入。 这个想法是用户不知道哪些是允许的值,所以他可以简单地在ComboBox中选择其中一个。

我试图制作我自己的“ComboBoxCell”,但它没有按预期工作:

public class ComboBoxCell extends TableCell { private ComboBox 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() { @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(); } } 

然后在我的“主”应用程序中:

 levelChoice = FXCollections.observableArrayList( new String("Bla"), new String("Blo") ); // Level Column : String value Callback comboBoxFactory = new Callback() { @Override public TableCell call(TableColumn p) { return new ComboBoxCell(); } }; levelColumn.setCellValueFactory( new PropertyValueFactory("level") ); levelColumn.setCellFactory(comboBoxFactory); 

有任何想法吗? 谢谢 !

我找到了解决方案:

 levelChoice = FXCollections.observableArrayList("Bla", "Blo"); levelColumn.setCellValueFactory( new PropertyValueFactory("level") ); levelColumn.setCellFactory(ComboBoxTableCell.forTableColumn(levelChoice)); levelColumn.setOnEditCommit( new EventHandler>() { @Override public void handle(CellEditEvent t) { ((ClassesProperty) t.getTableView().getItems().get(t.getTablePosition().getRow())).setLevel(t.getNewValue()); }; } );