JavaFX 从 TabContent(Node) 访问 Tab 或 TabPane

标签 java javafx javafx-2 javafx-8

如果您只引用 TabTabPane 中的 Node Tab 例如

TabPane tabPane = new TabPane();
Tab tab = new Tab();
tab.setText("new tab");
Rectangle drect = new Rectangle(200,200, Color.LIGHTSTEELBLUE);
tab.setContent(drect);
tabPane.getTabs().addAll(tab,new Tab("tab 2"));

假设我只引用了drect 我怎样才能得到tab。 我对 Node.setUserData() 不感兴趣,而且 drect.getParent().getClass().getName() 返回 TabPaneSkin 匿名内部类TabContentRegion:两个陌生人。

我想说的是 Node.getParent() 应该返回父节点 Node ,通用的单向知识 ( 节点在场景图中的表示可以使用 getParent() ) 进行跟踪,但是,当涉及到 Tab 时,它全错了,因此我的问题

编辑

为什么我需要这个,假设你有 TabPane 由很多 Tab 组成,在一个特定的 Tab 中你有一个 TreeView 作为它的 Node-Content 是根据某些条件选择的,对于那个特定的 TreeView 你有不同的自定义 Cell因为它的 TreeItem 在 UI 和功能方面有所不同——比如更改 styles 绑定(bind) Fonts 和其他可绑定(bind)对象以及动画 Tab 隐藏TabPane中的其他Tab,关闭其他Tab

在这种情况下,遵循这种方法对我来说似乎是合法的,因为您不会做不必要的事情,比如让 child 暴露在恶劣的天气中。 :-)

谢谢 James_D 爵士

最佳答案

Tab 本身并不是一个Node,因此您无法通过以任何方式遍历场景图来获取选项卡。如果您在层次结构中走得足够远,您可以到达 TabPane。例如:

private TabPane findTabPaneForNode(Node node) {
    TabPane tabPane = null ;

    for (Node n = node.getParent(); n != null && tabPane == null; n = n.getParent()) {
        if (n instanceof TabPane) {
            tabPane = (TabPane) n;
        }
    }

    return tabPane ;
}

将返回包含传入节点的最近的TabPane,如果节点不在选项卡 Pane 中,则返回null

但是,需要这个似乎是您的设计错误。如果您将一个节点放在选项卡 Pane 中,则在某个时候您会创建一个选项卡,因此您应该只组织您的代码以便获得对可用选项卡的引用。

关于JavaFX 从 TabContent(Node) 访问 Tab 或 TabPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33186784/

相关文章:

java - 在 Python 和 Groovy 之间传输简单对象

java - Mockito NullPointerException 在 InvocableMatcher 上调用 equals

intellij-idea - 显示 FileChooser 对话框时为 "java[934:22850] +[CATransaction synchronize] called within transaction"

button - TextField 为空时如何禁用按钮?

java - 如何在javafx中实现GridView样式

css - javafx 在运行时更改 css

java - 如何从列表中删除与集合中的值匹配的条目

java - 通过 HTTP 调用将更多值从一台服务器传输到另一台服务器的最佳方式?

model-view-controller - 游戏逻辑应该位于 JavaFx 应用程序中的哪个位置?

javafx - 使用 JavaFX 创建自定义文本编辑组件