2012-09-20 78 views
1

我想在listView的行上使用上下文菜单项。在listView的MOUSE_CLICKED事件的事件处理函数中,getSelectionModel()。getSelectedItem()返回选定的项目,那好。但是,当我处理contextMenuItem的onAction事件时,它将返回null。但是,以图形方式选择该项目。 有没有办法在第一个事件处理后“保留”选择?JavaFX ListView&ContextMenu - getSelectedItem()返回null

这里是代码的相关部分:

ListView<Text> nameList = new ListView<>(); 
    final ContextMenu cCm = new ContextMenu(); 
    MenuItem cItem = new MenuItem("someText"); 
    cCm.getItems().add(cItem); 

...

nameList.addEventHandler(MouseEvent.MOUSE_CLICKED, new EventHandler<MouseEvent>() { 

     @Override 
     public void handle(MouseEvent e) { 
      if (e.getButton() == MouseButton.SECONDARY) { 
        //its OK here: 
        System.out.println(nameList.getSelectionModel().getSelectedItem().getText()); 
        cCm.show(nameList, e.getScreenX(), e.getScreenY()); 
      } 
     } 
    }); 

    cItem.setOnAction(new EventHandler<ActionEvent>() { 

     @Override 
     public void handle(ActionEvent e) { 
      final Stage dialog = new Stage(); 
      dialog.initModality(Modality.WINDOW_MODAL); 
      //nullPointerException on the following: 
      Text t = new Text(nameList.getSelectionModel().getSelectedItem().getText()); 
      //showing dialog, etc. 
+0

随意标记我的答案是正确的。 –

回答

2

我几乎创造了你做了什么的精确复制品,和我的工作落实:

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()); 
} 

我没有任何空指针异常。总的来说你的实现看起来不错很有可能是你的列表视图中的项目有问题。