Контекстное меню в строке TableView?
Я использую JavaFX, и мое приложение имеет таблицу, и я могу добавлять элементы в таблицу, но я хочу создать контекстное меню, которое отображается в строке, когда я нажимаю правой кнопкой на этой строке.
Что у меня...
В Scene Builder у меня есть метод, который работает, когда активировано контекстное меню, но это не совсем то, что я хочу. Это было бы хорошо, потому что я программно захватываю выбранный элемент из таблицы всякий раз, когда захочу. Проблема, если я сохраню то, что у меня есть, вызывает контекстное меню для выбранного элемента.
contextMenu - это контекстное меню с элементами меню.
connectedUsers - TableView
Следующее - это самое близкое, которое я могу получить, но это показывает контекстное меню в нижней части TableView
contextMenu.show(connectedUsers, Side.BOTTOM, 0, 0);
Ответы
Ответ 1
попробуйте это.
ContextMenu cm = new ContextMenu();
MenuItem mi1 = new MenuItem("Menu 1");
cm.getItems().add(mi1);
MenuItem mi2 = new MenuItem("Menu 2");
cm.getItems().add(mi2);
table.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent t) {
if(t.getButton() == MouseButton.SECONDARY) {
cm.show(table, t.getScreenX(), t.getScreenY());
}
}
});
Ответ 2
Я считаю, что лучшим решением было бы это, как обсуждалось в здесь.
table.setRowFactory(
new Callback<TableView<Person>, TableRow<Person>>() {
@Override
public TableRow<Person> call(TableView<Person> tableView) {
final TableRow<Person> row = new TableRow<>();
final ContextMenu rowMenu = new ContextMenu();
MenuItem editItem = new MenuItem("Edit");
editItem.setOnAction(...);
MenuItem removeItem = new MenuItem("Delete");
removeItem.setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent event) {
table.getItems().remove(row.getItem());
}
});
rowMenu.getItems().addAll(editItem, removeItem);
// only display context menu for non-empty rows:
row.contextMenuProperty().bind(
Bindings.when(row.emptyProperty())
.then(rowMenu)
.otherwise((ContextMenu)null));
return row;
}
});
Ответ 3
JavaFX 8 (с лямбдой):
MenuItem mi1 = new MenuItem("Menu item 1");
mi1.setOnAction((ActionEvent event) -> {
System.out.println("Menu item 1");
Object item = table.getSelectionModel().getSelectedItem();
System.out.println("Selected item: " + item);
});
ContextMenu menu = new ContextMenu();
menu.getItems().add(mi1);
table.setContextMenu(menu);
Смотрите также:https://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/ContextMenu.html