Я довольно новичок в Java / JavaFX и пытаюсь создать пользовательский интерфейс, который управляет различными лабораторными настройками.В конечном счете, я хотел бы иметь ListView, который содержит элементы, которые могут иметь контекстное меню с одним вариантом переименования рассматриваемого элемента списка.
Я нашел этот учебник , который будет полезен длясоздавать контекстные меню.В настоящее время я реализовал только две опции: «Удалить» и «Переименовать».Тем не менее, я не могу заставить переименование работать.Я чувствую, что это связано с тем, как учебник обернул cellFactory, но мне сложно найти хорошее объяснение того, как клеточные фабрики работают с самого начала.
Я нашел много людей, предлагающих использовать "startEdit" или "forListView" для выполнения того, что я пытаюсь сделать, но моя IDE не может найти методы, даже когда я @ переопределяю их вContextMenuListCell или классы DefaultListCell (так что есть большая вероятность, что я делаю это неправильно).
У меня есть файл .fxml с ListView ('LabSetupList').Контроллер содержит:
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, но ячейка не становится редактируемой, как я ожидаю.
Кто-нибудь видит, где я это неправильно понимаю?Я попытался включить только соответствующий код, но дал мне знать, если чего-то не хватает (либо по случайному исключению, либо потому, что я никогда не писал это с самого начала!).