这是我第一次问这里,对不起,如果我做错了什么(也不是我的母语)。
最近,我从Swing& AWT搬到了JavaFX。
我发现新的表格与Swing版本截然不同。更好的我会说,它需要更少的操作并做更多的事情,但是......主,它更难以理解!
我目前正在尝试动态修改TableView。虽然addColumn方法不是一个很大的挑战,但我需要帮助我的deleteColumn方法:/
让我们谈谈我的问题:
我有一个包含许多组件的场景(窗格,按钮,菜单......)和一个窗格(实际上是一个窗格)承载一个TableView。
我希望在此操作发生时动态删除整个列: 用户右键单击TableView>上下文菜单显示>他选择项目"删除"
因此,基本上是一个上下文菜单,提供删除用户右键单击列的选项。
我试过了:
- >当用户右键单击TableView时,将调用此方法:
public void setTargetForContext(ContextMenuEvent event){
if(event.getTarget() instanceof Label){
ObservableList list =(((Label)event.getTarget()).getChildrenUnmodifiable());
activeColumn = ((Text)((ObservableList)list)).getText();
}...
目标是在" activeColumn"中设置列名。
然后,当用户选择"删除"从上下文菜单中选择另一个方法来比较列的名称并删除正确的列。
但似乎我无法在标签上调用getChildren()方法,只能调用不可修改的方法。并且它不允许强制转换并抛出异常。
您是否有解决方案允许我获取列名称?
或许我的方法错了,我必须找到另一种删除右键单击列的方法,但在这种情况下我也需要你的帮助。
非常感谢您阅读,并提前感谢您的帮助。
答案 0 :(得分:1)
首先,我要指出,如果你打电话
table.setTableMenuButtonVisible(true);
然后该表将有一个带有单选按钮的内置菜单按钮,允许用户选择显示哪些列。也许这就是你所需要的。
在Swing中,表格单元格的渲染器只是"橡皮图章"画在桌子上。因此,您无法使用它们为UI事件注册侦听器。
相比之下,在JavaFX中,表格中的单元格是具有完整功能的真实UI控件。这意味着不需要API从表中获取单元格坐标。您不应该使用TableView
注册您的监听器,而应使用您要操作的实际单元格。您可以从表格列的单元工厂访问单元格。
// the table:
TableView<RowDataType> table = new TableView<>();
//...
// A table column:
TableColumn<RowDataType, CellDataType> column = new TableColum<>("Header text");
// A context menu for the table column cells:
ContextMenu contextMenu = new ContextMenu();
MenuItem deleteColumnItem = new MenuItem("Remove Column");
deleteColumnItem.setOnAction(e -> table.getColumns().remove(column));
contextMenu.getItems().add(deleteColumnItem);
// Cell factory for the column
column.setCellFactory(col -> {
// basically a cell with default behavior:
TableCell<RowDataType, CellDataType> cell = new TableCell<RowDataType, CellDataType>() {
@Override
public void updateItem(CellDataType item, boolean empty) {
super.updateItem(item, empty);
if (item == null) {
setText(null);
} else {
setText(item.toString());
}
}
});
// add the context menu to the cell:
cell.setContextMenu(contextMenu);
return cell ;
});
如果您希望上下文菜单也出现在表格列标题中,您只需要执行
column.setContextMenu(contextMenu);