JavaFX:ContextMenu在一行中填充了一个条目之后?
我正在使用为每个表行创建上下文菜单。现在我遇到了一些问题,因为我不确定在“type”插入行之后如何附加ContextMenu 假设我正在使用一个.zip编辑器程序,它列出了内容。我有一个图像,一个文本文件,还有一些其他的东西,它们都在一个叫做Entry的类下。我的表的泛型类型是“Entry”,我希望能够根据每个条目的底层子类类型为其创建上下文菜单(比如ImageEntry可能返回一个菜单项,以便在图像编辑器中打开它……等等) 现在我有一个通用的上下文菜单,但它不是伟大的显示菜单项打开一个文本文件与图像编辑器JavaFX:ContextMenu在一行中填充了一个条目之后?,java,javafx,Java,Javafx,我正在使用为每个表行创建上下文菜单。现在我遇到了一些问题,因为我不确定在“type”插入行之后如何附加ContextMenu 假设我正在使用一个.zip编辑器程序,它列出了内容。我有一个图像,一个文本文件,还有一些其他的东西,它们都在一个叫做Entry的类下。我的表的泛型类型是“Entry”,我希望能够根据每个条目的底层子类类型为其创建上下文菜单(比如ImageEntry可能返回一个菜单项,以便在图像编辑器中打开它……等等) 现在我有一个通用的上下文菜单,但它不是伟大的显示菜单项打开一个文本文件
这可能吗?如果是这样,正确的方法是什么?将侦听器添加到行的
项目属性(表示行中显示的项目)中,并在其更改时更新上下文菜单:
table.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
@Override
public TableRow<Person> call(TableView<Person> tableView) {
final TableRow<Person> row = new TableRow<>();
final ContextMenu contextMenu = new ContextMenu();
row.itemProperty().addListener((obs, oldPerson, newPerson) -> {
contextMenu.getItems().clear();
// add items to context menu depending on value of newPerson
// ...
});
// 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)
);
return row ;
}
});
table.setRowFactory(新回调(){
@凌驾
公共TableRow调用(TableView TableView){
最终TableRow行=新TableRow();
最终上下文菜单上下文菜单=新上下文菜单();
row.itemProperty().addListener((obs、oldPerson、newPerson)->{
contextMenu.getItems().clear();
//根据newPerson的值将项目添加到上下文菜单
// ...
});
//在行上设置上下文菜单,但使用绑定使其仅显示为非空行:
row.contextMenuroperty().bind(
Bindings.when(row.emptyProperty())
.then((上下文菜单)null)
。否则(上下文菜单)
);
返回行;
}
});
将侦听器添加到行的itemProperty
(表示行中显示的项),并在上下文菜单发生更改时更新它:
table.setRowFactory(new Callback<TableView<Person>, TableRow<Person>>() {
@Override
public TableRow<Person> call(TableView<Person> tableView) {
final TableRow<Person> row = new TableRow<>();
final ContextMenu contextMenu = new ContextMenu();
row.itemProperty().addListener((obs, oldPerson, newPerson) -> {
contextMenu.getItems().clear();
// add items to context menu depending on value of newPerson
// ...
});
// 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)
);
return row ;
}
});
table.setRowFactory(新回调(){
@凌驾
公共TableRow调用(TableView TableView){
最终TableRow行=新TableRow();
最终上下文菜单上下文菜单=新上下文菜单();
row.itemProperty().addListener((obs、oldPerson、newPerson)->{
contextMenu.getItems().clear();
//根据newPerson的值将项目添加到上下文菜单
// ...
});
//在行上设置上下文菜单,但使用绑定使其仅显示为非空行:
row.contextMenuroperty().bind(
Bindings.when(row.emptyProperty())
.then((上下文菜单)null)
。否则(上下文菜单)
);
返回行;
}
});