javafx 创建 ComboBox TableCell
Posted
技术标签:
【中文标题】javafx 创建 ComboBox TableCell【英文标题】:javafx create ComboBox TableCell 【发布时间】:2014-03-18 13:48:25 【问题描述】:我正在尝试在我的 TableView 中创建一个自定义 TableCell。我希望它显示一个组合框,我可以在其中选择一个字符串值,然后将字符串值显示为用户输入。这个想法是用户不知道哪些是允许的值,因此他可以简单地在 ComboBox 中选择其中一个。
我试着做我自己的“ComboBoxCell”,但它没有按预期工作:
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();
然后在我的“主要”应用程序中:
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);
有什么想法吗? 谢谢!
【问题讨论】:
【参考方案1】:我找到了解决方案:
levelChoice = FXCollections.observableArrayList("Bla", "Blo");
levelColumn.setCellValueFactory(
new PropertyValueFactory<ClassesProperty, String>("level")
);
levelColumn.setCellFactory(ComboBoxTableCell.forTableColumn(levelChoice));
levelColumn.setOnEditCommit(
new EventHandler<CellEditEvent<ClassesProperty, String>>()
@Override
public void handle(CellEditEvent<ClassesProperty, String> t)
((ClassesProperty) t.getTableView().getItems().get(t.getTablePosition().getRow())).setLevel(t.getNewValue());
;
);
【讨论】:
handle
中的行也可以是:t.getRowValue().setLevel(t.getNewValue());
,这样可以避免强制转换。以上是关于javafx 创建 ComboBox TableCell的主要内容,如果未能解决你的问题,请参考以下文章
如何将图像工具提示添加到 JavaFX 中的 ComboBox 项?
可编辑 JavaFX ComboBox 上的 MouseListener