JavaFX:如何设置 TabPane header onClick 事件的监听器

标签 java javafx click tabpanel

这是一个奇怪的问题,所以我会尽力正确地解释自己。

我想要的是在单击 TabPane 中的选项卡时触发一个事件,“单击”是指只是单击,不一定是选择。

我已经尝试使用 TabselectedProperty ,但是只有在未选择选项卡时单击该选项卡时才会调用该事件,即使在未选择时单击该选项卡也不会调用该事件它已经被选择了。

我这样做的原因是我试图制作一个可折叠的选项卡 Pane ,如果您再次单击打开的选项卡,它会隐藏 TabPane 的内容,我已经编写了用于折叠 TabPane 的代码这可行,但是...我不知道如何从选项卡标题获取点击事件。

我什至也研究过 TabPane 源代码,希望能够找到选项卡 header 容器,但我没有在那里找到它。

最佳答案

不需要全新的皮肤 - 我们可以通过查找访问头节点。请注意:意味着依赖于实现细节,这些细节可能会因版本而异。

要查找的(未记录的!)样式 ID 是“.tab-container” - 这是 TabHeaderSkin 的唯一子级(==单个选项卡标题的区域)。它包含标签、关闭按钮(如果有)和焦点标记。这个“皮肤”在其属性中保留对其选项卡的引用(当然,未记录;)

所以基本方法是

  • 安装皮肤后查找所有选项卡容器
  • 对于每个,在其父级上注册适当的鼠标处理程序
  • 在相应的 mouseEvent 上,执行所需的操作

请注意,修改选项卡列表时必须删除/添加监听器(不包含在下面的代码片段中)。

在示例代码中:

/** 
 * looks up the styled part of tab header and installs a mouseHandler
 * which calls the work load method.
 * 
 * @param tabPane
 */
private void installTabHandlers(TabPane tabPane) {
    Set<Node> headers = tabPane.lookupAll(".tab-container");
    headers.forEach(node -> {
        // implementation detail: header of tabContainer is the TabHeaderSkin
        Parent parent = node.getParent();
        parent.setOnMouseClicked(ev -> handleHeader(parent));
    });
}

/**
 * Workload for tab.
 * @param tabHeaderSkin
 */
private void handleHeader(Node tabHeaderSkin) {
    // implementation detail: skin keeps reference to associated Tab
    Tab tab = (Tab) tabHeaderSkin.getProperties().get(Tab.class);
    System.out.println("do stuff for tab: " + tab.getText());
}

关于JavaFX:如何设置 TabPane header onClick 事件的监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63132948/

相关文章:

java - AWS S3AsyncClient 在尝试从对象存储读取内容时出现凭证问题

javafx - TornadoFX:标签文本未更新

java - 来自另一个线程的最小化 javafx 阶段

javascript - 如何修复 Javascript 中的点击模拟

python - 如何检测任务栏上的点击?

javascript - 为什么我的 Controller 中的保存功能不起作用?

java - 为什么 Maven 不显示 Lenskin 伪影?

java - 如何为此 REST 响应编写 getter setter 类以进行改造

javascript - 在不调整图像大小的情况下更改图像的可点击区域

Java FX - Cp1252 字符编码错误