Dynamic TableView通过上下文菜单删除列

Dynamic TableView通过上下文菜单删除列,dynamic,javafx,tableview,Dynamic,Javafx,Tableview,这是我第一次在这里问,如果我做错了什么对不起(也不是用我的母语) 最近,我从Swing&AWT转到了JavaFX 我发现了与Swing版本完全不同的新表。我想说的更好,它需要更少的操作和做更多的事情,但是。。。主啊,这更难理解 我目前正在尝试动态修改TableView。虽然addColumn方法不是一个大挑战,但我的deleteColumn方法需要帮助:/ 让我们谈谈我的问题: 我有一个场景,上面有许多组件(窗格、按钮、菜单等等),一个窗格(实际上是一个主播)承载一个表视图 我希望在执行此操作时

这是我第一次在这里问,如果我做错了什么对不起(也不是用我的母语)

最近,我从Swing&AWT转到了JavaFX

我发现了与Swing版本完全不同的新表。我想说的更好,它需要更少的操作和做更多的事情,但是。。。主啊,这更难理解

我目前正在尝试动态修改TableView。虽然addColumn方法不是一个大挑战,但我的deleteColumn方法需要帮助:/

让我们谈谈我的问题:

我有一个场景,上面有许多组件(窗格、按钮、菜单等等),一个窗格(实际上是一个主播)承载一个表视图

我希望在执行此操作时动态删除整个列: 用户在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()方法,只能调用不可修改的方法。它不允许强制转换并抛出异常

您有允许我获取列名的解决方案吗

或者我走错了方向,我必须找到另一种方法来删除右键单击的列,但在这种情况下,我也需要您的帮助


非常感谢您的阅读,并提前感谢您的帮助。

首先,请允许我指出,如果您致电

table.setTableMenuButtonVisible(true);
然后,该表将有一个内置菜单按钮,该按钮带有单选按钮,允许用户选择显示哪些列。也许这就是你所需要的

在Swing中,表格单元格的渲染器只是绘制在表格上的“橡皮图章”。因此,您不能向它们注册UI事件的侦听器

相比之下,在JavaFX中,表中的单元格是具有完整功能的真实UI控件。这意味着不需要从表中获取单元格坐标的API。您不应使用
表视图
注册侦听器,而应使用您要操作的实际单元格。可以从表列的单元工厂访问单元

// 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 ;
});

噢非常感谢,我将不得不更加努力地了解FX的所有新功能。不管怎么说,这解决了我的问题,并导致了正确的道路!谢谢
column.setContextMenu(contextMenu);