JavaFX:ContextMenu在一行中填充了一个条目之后?

JavaFX:ContextMenu在一行中填充了一个条目之后?,java,javafx,Java,Javafx,我正在使用为每个表行创建上下文菜单。现在我遇到了一些问题,因为我不确定在“type”插入行之后如何附加ContextMenu 假设我正在使用一个.zip编辑器程序,它列出了内容。我有一个图像,一个文本文件,还有一些其他的东西,它们都在一个叫做Entry的类下。我的表的泛型类型是“Entry”,我希望能够根据每个条目的底层子类类型为其创建上下文菜单(比如ImageEntry可能返回一个菜单项,以便在图像编辑器中打开它……等等) 现在我有一个通用的上下文菜单,但它不是伟大的显示菜单项打开一个文本文件

我正在使用为每个表行创建上下文菜单。现在我遇到了一些问题,因为我不确定在“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)
。否则(上下文菜单)
);  
返回行;
}  
});