【问题标题】:TableView delete column via contextual menuTableView 通过上下文菜单删除列
【发布时间】:2015-02-06 09:38:34
【问题描述】:

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

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

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

我目前正在尝试动态修改 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() 方法,只能调用不可修改的方法。而且它不允许强制转换并抛出异常。

你有解决办法让我得到列名吗?

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

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

【问题讨论】:

    标签: dynamic javafx tableview


    【解决方案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);
    

    【讨论】:

    • 哇!非常感谢,我将不得不更加努力地了解 FX 的所有新功能。无论如何,这解决了我的问题,它导致了正确的方法!谢谢!
    猜你喜欢
    • 2015-05-16
    • 2018-01-09
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-10
    • 1970-01-01
    相关资源
    最近更新 更多