2012-09-20 74 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()); 
} 

我沒有任何空指針異常。總的來說你的實現看起來不錯很有可能是你的列表視圖中的項目有問題。