JavaFX:在一行中填充了一个条目后的上下文菜单?
JavaFX: ContextMenu after a row has been filled with an entry?
我正在使用 this link 为每个 table 行创建一个上下文菜单。现在我 运行 遇到了问题,因为我不确定如何在 'type' 插入一行后附加上下文菜单。
假设我正在使用 .zip 编辑器程序,它列出了内容。我有一个图像、一个文本文件和其他一些东西,它们都在一个名为 Entry 的 class 下。我的 table 的通用类型是 'Entry',我希望能够根据每个条目的底层子 class 类型为每个条目创建一个上下文菜单(就像 ImageEntry 可能 return 一个菜单项,用于在图像编辑器中打开它...等)。
现在我有一个适用于所有内容的通用上下文菜单,但是显示关于使用图像编辑器打开文本文件的菜单项并不是很好...
这可以吗?如果是这样,正确的做法是什么?
向该行的 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 ;
}
});
我正在使用 this link 为每个 table 行创建一个上下文菜单。现在我 运行 遇到了问题,因为我不确定如何在 'type' 插入一行后附加上下文菜单。
假设我正在使用 .zip 编辑器程序,它列出了内容。我有一个图像、一个文本文件和其他一些东西,它们都在一个名为 Entry 的 class 下。我的 table 的通用类型是 'Entry',我希望能够根据每个条目的底层子 class 类型为每个条目创建一个上下文菜单(就像 ImageEntry 可能 return 一个菜单项,用于在图像编辑器中打开它...等)。
现在我有一个适用于所有内容的通用上下文菜单,但是显示关于使用图像编辑器打开文本文件的菜单项并不是很好...
这可以吗?如果是这样,正确的做法是什么?
向该行的 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 ;
}
});