JavaFX:如何将侦听器设置为TabPane标头onClick事件



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

我想要的是当TabPane中的Tab被点击时触发事件;点击";我的意思是,只是点击,不一定是选中。

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

我这样做的原因是,我试图制作一个可折叠的选项卡窗格,隐藏TabPane的内容。如果你再次单击打开的选项卡,我已经编写了折叠TabPane和工作的代码,但是。。。我不知道如何从选项卡标题中获取点击事件。

我甚至还查看了TabPane的源代码,希望能找到选项卡标题容器,但我没有在那里找到。

不需要全新的皮肤-我们可以通过查找来访问头部节点。小心:这意味着依赖于实现细节,这些细节可能会在不同版本之间发生变化。

要查找的(未记录的!(样式id是";。标签容器"-这是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());
}

最新更新