在 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()
解决了问题。
我使用 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()
解决了问题。