javafx之在 JavaFX 中,如何确定获得焦点的节点是否是我自己的子节点

tuyile006 阅读:15 2024-02-27 23:08:18 评论:0

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

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

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

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

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

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

请您参考如下方法:

我从一个节点开始搜索,转换到子节点并检查焦点节点是否是子节点。这并不优雅 - 当然感觉应该有更好的方法。但这是我过去使用的方法:

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 作为根级父级),当父级的 focusProperty() 更改为 false (通过属性更改监听器)时调用它。


标签:java
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号