4

我正在使用 JavaFX 中的 TableView。我想做的是跟踪对表格所做的编辑。当用户离开表格时,我想检查是否有任何编辑,如果有,提示用户询问他们是否要保存更改。

我有 TableView 工作,我可以跟踪编辑,我可以确定 TableView 何时失去焦点(使用focusedProperty 更改侦听器)。

但是,问题是当单击单元格进行编辑时,会触发表格的focusedProperty 更改侦听器(编辑单元格获得焦点,表格本身失去焦点)。我真正想要的是一种方法来判断,当焦点发生变化时,它是更改为表格的子节点(例如列或单元格)还是表格外部的内容(在父 GUI 上选择不同的选项卡)。但我不想将侦听器添加到可以单击的每个其他可能节点。

如果我知道如何获取当前关注的项目(还没有看到如何做到这一点),我可以递归调用 getParent() 并检查 TableView 是否在该列表中,如果是,我会知道它是一个孩子. 但是我还没有看到一种通用的方法来获取应用程序中当前关注的节点。

没有很好的通用方法来遍历表的孩子,因为 getChildrenUnmodifiable() 返回我 Node() 类型(我想我可以强制转换每个类型以确定它们是否都有更多的孩子),或者我必须去 TableColumns 然后那里的单元格(并检查每个单元格的图形)。

我可能会递归地遍历子项,根据需要进行强制转换,并在此时检查 isFocused() ,除非有更好的解决方案。但我希望这里的某个人可能对这个问题有更好的解决方案,最好是更通用的解决方案。

4

2 回答 2

6

我从一个节点开始搜索,投射到子节点并检查焦点节点是否是一个子节点。它并不优雅——当然感觉应该有更好的方法。但这是我以前这样做的方法:

private boolean isChildFocused(javafx.scene.Parent parent)
{
    for (Node node : parent.getChildrenUnmodifiable())
    {
        if (node.isFocused())
        {
            return true;
        }
        else if (node instanceof javafx.scene.Parent)
        {
            if (isChildFocused((javafx.scene.Parent)node))
            {
                return true;
            }
        }
    }
    return false;
}

它似乎工作正常(至少使用 TableView 作为根级父级),当父级的focusedProperty()更改为false(通过属性更改侦听器)时调用它。

于 2013-07-19T02:48:54.857 回答
6

您可以通过场景的 getFocusOwner() 或 focusOwnerProperty() 获取当前聚焦的节点。正如您所说,从焦点节点遍历到 TableView 更好。

    public void createTable() {
        TableView tableView = new TableView();
        tableView.focusedProperty().addListener((ObservableValue<? extends Boolean> observable, Boolean oldValue, Boolean newValue) -> {
            if (oldValue && !newValue) {
                if (!isParent(tableView, tableView.getScene().getFocusOwner())) {
                    System.out.println("Saving changes.");
                }
            }
        });
    }

    public boolean isParent(Parent parent, Node child) {
        if (child == null) {
            return false;
        }
        Parent curr = child.getParent();
        while (curr != null) {
            if (curr == parent) {
                return true;
            }
            curr = curr.getParent();
        }
        return false;
    }
于 2015-05-21T05:32:37.463 回答