作者:perfect--林榆盛 | 来源:互联网 | 2023-05-24 02:23
我已经看过一些以前的问题,但它们似乎只能点击列表视图中的任何地方点击将触发事件,我正在寻找一个只触发事件的解决方案,并在a时打开上下文菜单单击列表视图中的属性.
1> James_D..:
这实际上是重复的,但我找不到上一个问题.
您应该使用单元工厂并在单元格上设置上下文菜单.然后,您可以确保仅在非空单元格上设置上下文菜单.(这也让您有机会获得特定于项目的上下文菜单.)
这是一个简单的例子:
import javafx.application.Application;
import javafx.beans.binding.Bindings;
import javafx.scene.Scene;
import javafx.scene.control.ContextMenu;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.control.MenuItem;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
public class ListViewContextMenuExample extends Application {
@Override
public void start(Stage primaryStage) {
ListView listView = new ListView<>();
listView.getItems().addAll("One", "Two", "Three");
listView.setCellFactory(lv -> {
ListCell cell = new ListCell<>();
ContextMenu cOntextMenu= new ContextMenu();
MenuItem editItem = new MenuItem();
editItem.textProperty().bind(Bindings.format("Edit \"%s\"", cell.itemProperty()));
editItem.setOnAction(event -> {
String item = cell.getItem();
// code to edit item...
});
MenuItem deleteItem = new MenuItem();
deleteItem.textProperty().bind(Bindings.format("Delete \"%s\"", cell.itemProperty()));
deleteItem.setOnAction(event -> listView.getItems().remove(cell.getItem()));
contextMenu.getItems().addAll(editItem, deleteItem);
cell.textProperty().bind(cell.itemProperty());
cell.emptyProperty().addListener((obs, wasEmpty, isNowEmpty) -> {
if (isNowEmpty) {
cell.setContextMenu(null);
} else {
cell.setContextMenu(contextMenu);
}
});
return cell ;
});
BorderPane root = new BorderPane(listView);
primaryStage.setScene(new Scene(root, 250, 400));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}