在 JAVAFX 中使用 ObservableMap 设计的 TableView 添加上下文菜单

Adding Context Menu to TableView designed using ObservableMap in JAVAFX

我使用 ObservableMap 而不是 ObservableList 创建了一个 table。可以看代码(不是我写的)here。现在我需要向每一行添加上下文菜单。所以我写了如下代码:

public MapTableView<String, LineItem> initialize(MapTableView<String, LineItem> tableView) {

    tableView.setRowFactory((TableView<Entry<String, LineItem>> tableView1) -> {

        final TableRow<Entry<String, LineItem>> row = new TableRow<>();
        final ContextMenu contextMenu = new ContextMenu();
        final MenuItem cancelMenuItem = new MenuItem("Cancel");
        cancelMenuItem.setOnAction((ActionEvent event) -> {

           LineItem item  =  tableView1.getSelectionModel().getSelectedItem().getValue();
           System.out.println(item.getLineNo()); // gives me null
            });

        });

        contextMenu.getItems().add(cancelMenuItem);

        // Set context menu on row, but use a binding to make it only show for non-empty rows:
        row.contextMenuProperty().bind(Bindings.when(row.emptyProperty()).then((ContextMenu) null)
                .otherwise(contextMenu)
        );  tableView1.setContextMenu(contextMenu);
        return row;
    });

    return tableView;
}

实际上它是从 table 中检索顺序,但是当我访问对象的变量时它给了我 "null"。我不知道我在做什么错。请帮我解决一下这个。此外,我正在初始化 table 与:

tableView.setEditable(false);
tableView.setColumnResizePolicy(TableView.UNCONSTRAINED_RESIZE_POLICY);

我是否必须使用类似的东西:

tableView.getSelectionModel().setCellSelectionEnabled(true);

一切正常,但是当我尝试访问 "item" 的变量时,我得到了 "Null Pointer Exception",因为值为空,但对象不为空。提前致谢。

正如@James_D所说,使用

LineItem item = row.getItem().getValue() 解决了问题。