javafxlistview&;ContextMenu-getSelectedItem()返回空值

javafxlistview&;ContextMenu-getSelectedItem()返回空值,java,event-handling,javafx-2,Java,Event Handling,Javafx 2,我想在listView的行上使用上下文菜单项。在listView的鼠标单击事件的事件处理程序中,getSelectionModel().getSelectedItem()返回所选项目,这没关系。但是,当我处理contextMenuItem的onAction事件时,它返回null。但是,以图形方式选择该项。 有没有办法在第一次事件处理后“保留”选择 以下是守则的相关部分: ListView<Text> nameList = new ListView<>();

我想在listView的行上使用上下文菜单项。在listView的鼠标单击事件的事件处理程序中,getSelectionModel().getSelectedItem()返回所选项目,这没关系。但是,当我处理contextMenuItem的onAction事件时,它返回null。但是,以图形方式选择该项。 有没有办法在第一次事件处理后“保留”选择

以下是守则的相关部分:

    ListView<Text> nameList = new ListView<>();
    final ContextMenu cCm = new ContextMenu();
    MenuItem cItem = new MenuItem("someText");
    cCm.getItems().add(cItem);
ListView名称列表=新建ListView();
最终上下文菜单cCm=新上下文菜单();
MenuItem cItem=新MenuItem(“someText”);
cCm.getItems().add(cItem);

nameList.addEventHandler(MouseEvent.MOUSE_单击,新建EventHandler()){
@凌驾
公共无效句柄(MouseEvent e){
如果(例如getButton()==MouseButton.SECONDARY){
//这里没问题:
System.out.println(nameList.getSelectionModel().getSelectedItem().getText());
show(名称列表,e.getScreenX(),e.getScreenY());
}
}
});
cItem.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent e){
最终阶段对话框=新阶段();
初始化模态(模态窗口模态);
//以下项上的nullPointerException:
Text t=新文本(nameList.getSelectionModel().getSelectedItem().getText());
//显示对话框等。

我几乎创建了一个与您所做的完全相同的副本,并且我的实现工作正常:

private void initRandomCardListView() {
    populateRandomList();
    final ContextMenu randomListContextMenu = new ContextMenu();
    MenuItem replaceCardMenuItem = new MenuItem("Replace");
    replaceCardMenuItem.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            replaceRandomCard();
        }
    });
    randomListContextMenu.getItems().add(replaceCardMenuItem);

    randomCardList.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if (event.getButton().equals(MouseButton.SECONDARY)) {
                randomListContextMenu.show(randomCardList, event.getScreenX(), event.getScreenY());
            }
        }
    });
}

private void replaceRandomCard() {
    System.out.println("jobs done");
    System.out.println("card selected: " + randomCardList.selectionModelProperty().get().getSelectedItem().toString());
    System.out.println("card index: " + randomCardList.getSelectionModel().getSelectedIndex());
    System.out.println("card index: " + randomCardList.getSelectionModel().getSelectedItem().toString());
}
private void initRandomCardListView(){
大众传播学();
final ContextMenu randomListContextMenu=新建ContextMenu();
MenuItem replaceCardMenuItem=新的MenuItem(“替换”);
replaceCardMenuItem.setOnAction(新的EventHandler(){
@凌驾
公共无效句柄(ActionEvent事件){
替换随机卡();
}
});
randomListContextMenu.getItems().add(replaceCardMenuItem);
randomCardList.addEventHandler(单击MouseEvent.MOUSE_,新建EventHandler()){
@凌驾
公共无效句柄(MouseeEvent事件){
if(event.getButton().equals(MouseButton.SECONDARY)){
显示(randomCardList,event.getScreenX(),event.getScreenY());
}
}
});
}
私人信用卡(){
System.out.println(“完成的工作”);
System.out.println(“所选卡片:“+randomCardList.selectionModelProperty().get().getSelectedItem().toString());
System.out.println(“卡片索引:+randomCardList.getSelectionModel().getSelectedIndex());
System.out.println(“卡片索引:+randomCardList.getSelectionModel().getSelectedItem().toString());
}

我没有任何空指针异常。总体而言,您的实现看起来不错。listview中的项目很可能有问题。

请随时将我的答案标记为正确。
private void initRandomCardListView() {
    populateRandomList();
    final ContextMenu randomListContextMenu = new ContextMenu();
    MenuItem replaceCardMenuItem = new MenuItem("Replace");
    replaceCardMenuItem.setOnAction(new EventHandler<ActionEvent>() {
        @Override
        public void handle(ActionEvent event) {
            replaceRandomCard();
        }
    });
    randomListContextMenu.getItems().add(replaceCardMenuItem);

    randomCardList.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent event) {
            if (event.getButton().equals(MouseButton.SECONDARY)) {
                randomListContextMenu.show(randomCardList, event.getScreenX(), event.getScreenY());
            }
        }
    });
}

private void replaceRandomCard() {
    System.out.println("jobs done");
    System.out.println("card selected: " + randomCardList.selectionModelProperty().get().getSelectedItem().toString());
    System.out.println("card index: " + randomCardList.getSelectionModel().getSelectedIndex());
    System.out.println("card index: " + randomCardList.getSelectionModel().getSelectedItem().toString());
}