TableView通过上下文菜单删除列

时间:2014-12-08 16:59:24

标签: dynamic javafx tableview

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

最近,我从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()方法,只能调用不可修改的方法。并且它不允许强制转换并抛出异常。

您是否有解决方案允许我获取列名称?

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

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

1 个答案:

答案 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);