我对Java / JavaFX很陌生,正在尝试创建一个管理不同实验室设置的UI。最终,我希望拥有一个ListView,其中包含可以具有上下文菜单的项目,其中一个选项是重命名有问题的列表项目。
我发现this tutorial对创建上下文菜单很有帮助。目前,我仅实现了两个选项,即“删除”选项和“重命名”。但是,我无法重命名。我觉得这与本教程包装cellFactory的方式有关,但是我很难找到关于单元工厂如何工作的良好解释。
我发现很多人建议人们可以使用“ startEdit”或“ forListView”来完成我想做的事情,但是我的IDE无法找到这些方法,即使我在ContextMenuListCell或DefaultListCell类(所以我做错的机会很大)。
我有一个带ListView('LabSetupList')的.fxml文件。控制器包含:
public ListView LabSetupList;
public void newSetup() {
if (LightHBox.getChildren().size() > 0) {
LabSetupList.getItems().add("New Setup");
// Create a MenuItem and place it in a ContextMenu
MenuItem renameItem = new MenuItem("Rename");
MenuItem deleteItem = new MenuItem("Delete");
ContextMenu contextMenu = new ContextMenu(renameItem, deleteItem);
LabSetupList.setCellFactory(ContextMenuListCell.<LabSetup>forListView(contextMenu));
renameItem.setOnAction(new EventHandler<ActionEvent>() {
@Override public void handle(ActionEvent e) {
LabSetupList.edit(LabSetupList.getSelectionModel().getSelectedIndex());
System.out.println("Selected item: " + LabSetupList.getSelectionModel().getSelectedItem());
}
});
deleteItem.setOnAction(new EventHandler<ActionEvent>(){
@Override public void handle(ActionEvent e) {
LabSetupList.getItems().remove(LabSetupList.getSelectionModel().getSelectedIndex());
System.out.println("Deleting: " + LabSetupList.getSelectionModel().getSelectedItem());
}
});
}
}
在CellFactory的ContextMenuListCell类中:
public class ContextMenuListCell<T> extends ListCell<T> {
public static <T> Callback<ListView<T>,ListCell<T>> forListView(ContextMenu contextMenu) {
return forListView(contextMenu, null);
}
public static <T> Callback<ListView<T>,ListCell<T>> forListView(final ContextMenu contextMenu, final Callback<ListView<T>,ListCell<T>> cellFactory) {
return new Callback<ListView<T>,ListCell<T>>() {
@Override public ListCell<T> call(ListView<T> listView) {
ListCell<T> cell = cellFactory == null ? new DefaultListCell<T>() : cellFactory.call(listView);
cell.setContextMenu(contextMenu);
return cell;
}
};
}
public ContextMenuListCell(ContextMenu contextMenu) {
setContextMenu(contextMenu);
}
}
当我添加新设置并右键单击该单元格时,我将看到预期的上下文菜单。当我单击“重命名”时,我仍然得到println输出,但是单元格没有像我期望的那样可编辑。
有人看到我误解了吗?我试图只包含相关代码,但是让我知道是否缺少某些内容(由于意外排除,或者因为我从未写过!)。