1

listView の行でコンテキスト メニュー項目を使用したいと考えています。listView の MOUSE_CLICKED イベントのイベント ハンドラーでは、getSelectionModel().getSelectedItem() が選択された項目を返します。しかし、contextMenuItem の onAction イベントを処理すると、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.
4

1 に答える 1

3

私はあなたがしたことの正確なレプリカをほとんど作成しました、そして私の実装はうまくいきました:

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

null ポインターの例外はありません。全体的に、実装は良さそうです。リストビューのアイテムに何か問題がある可能性が高いです。

于 2013-11-21T05:42:30.363 に答える