【问题标题】:In JavaFX how do I determine if the node gaining focus is a child node of myself?在 JavaFX 中,如何确定获得焦点的节点是否是我自己的子节点?
【发布时间】:2013-07-18 18:33:37
【问题描述】:

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

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

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

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

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

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

【问题讨论】:

    标签: javafx


    【解决方案1】:

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

    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 时调用它(通过属性更改侦听器)。

    【讨论】:

      【解决方案2】:

      您可以通过场景的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;
          }
      

      【讨论】:

        猜你喜欢
        • 2011-08-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-07-25
        • 2020-08-28
        • 1970-01-01
        • 2018-10-08
        相关资源
        最近更新 更多