【问题标题】:JavaFX - How to refer to a cell's neighbor in tableviewJavaFX - 如何在表格视图中引用单元格的邻居
【发布时间】:2017-10-20 01:55:03
【问题描述】:

我正在努力在 JavaFX 中创建一个包含可编辑属性的表。我希望能够使用每行中包含的按钮开始编辑、提交更改和取消;但是,我在引用要开始编辑的单元格时遇到了一些困难。理想情况下,我想做类似的事情:

controller.buttonColumn.setCellFactory(p -> new TableCell<TableItem, String>(){
            @Override
            protected void updateItem(String s, boolean empty) {
                super.updateItem(s, empty);
                if (getTableRow().getItem()==null){
                    setGraphic(null);
                    return;
                }
                Button editButton = new Button("Edit");
                editButton.setOnAction(event -> {
                    getTableRow().getCell(1).startEdit();
                });
                setGraphic(editButton);

        });

这不起作用,因为 TableRow 没有访问特定单元格的方法。同样,我可以使用这样的一行:

getTableView().getEditingCell().cancelEdit();

对于我的取消按钮,但是getEditingCell()方法返回的不是TableCell而是TablePosition,它没有访问对应单元格的方法。

tl;博士 我正在寻找一种方法来访问 TableView 中的单元格,因为它是邻居。

【问题讨论】:

    标签: button javafx tableview tablerow tablecell


    【解决方案1】:

    您可以使用TableView.edit(int row, TableColumn&lt;S,?&gt; column) method:

    controller.buttonColumn.setCellFactory(p -> new TableCell<TableItem, String>(){
        @Override
        protected void updateItem(String s, boolean empty) {
            super.updateItem(s, empty);
            if (getTableRow().getItem()==null){
                setGraphic(null);
                return;
            }
            Button editButton = new Button("Edit");
            editButton.setOnAction(event -> {
                getTableView().edit(getIndex(), someTableColumn);
            });
            setGraphic(editButton);
        }
    });
    

    其中someTableColumn 是包含您要开始编辑的单元格的列。

    您可以使用相同的方法取消编辑:

    tableView.edit(-1, null);
    

    【讨论】:

    • 我相信这就是我一直在寻找的答案。到目前为止,它似乎运作良好。对于可用于“提交编辑”按钮的类似解决方案,您有什么建议吗?
    • @DarthRitis 否:但commitEdit 存在更多基本问题。一旦焦点从表格单元格移开(例如,如果用户单击某处的按钮),单元格的默认实现将取消编辑,因此您将无法轻松提交。可能最简单的解决方法是“记住”正在编辑的项目并直接更新模型。
    • 在失去焦点时取消编辑是我可以接受的行为。现在,我的解决方案是在调用 updateItem(...) 时将每个单元格存储在一个列表中,然后在列表中循环搜索 cell.isEditing() 为 true 的单元格并在其上调用 commitEdit(...)细胞。这似乎可行,我只是希望有一个更优雅的解决方案。如果您有任何想法,请告诉我,感谢您的所有帮助。
    • @DarthRitis 也许我不完全理解你想要做什么。你想什么时候打电话给commitEdit(...)。当用户按下不属于正在提交编辑的单元格的某个按钮时,我以为您正在尝试执行此操作。
    • 我只想在按下提交按钮时提交编辑。此按钮将位于与编辑单元格位于同一行的单元格中。任何其他操作都应该不执行任何操作或取消编辑
    猜你喜欢
    • 1970-01-01
    • 2022-08-20
    • 1970-01-01
    • 1970-01-01
    • 2016-04-26
    • 2016-05-09
    • 1970-01-01
    • 2014-12-14
    • 2020-10-16
    相关资源
    最近更新 更多