java - JavaFX:如何为 TabPane 标头 onClick 事件设置侦听器
问题描述
这是一个奇怪的问题,所以我会尽力正确解释自己。
我想要的是在 TabPane 中的选项卡被点击时触发一个事件,并且“点击”我的意思是只是点击,不一定被选中。
我已经尝试使用 的selectedProperty
,Tab
但是只有在未选择选项卡时单击它时才会调用该事件,即使在它已被选中时单击它也是如此。
我这样做的原因是我正在尝试制作一个可折叠的选项卡窗格,如果您再次单击打开的选项卡,它会隐藏 TabPane 的内容,我已经编写了用于折叠 TabPane 的代码并且可以工作但是......我不知道如何从选项卡标题中获取点击事件。
我什至也查看了 TabPane 源代码,希望我能找到选项卡标题容器,但我没有在那里找到它。
解决方案
不需要全新的皮肤——我们可以通过查找访问头节点。注意:意味着依赖于实现细节,这可能会因版本而异。
要查找的(未记录!)样式 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());
}
推荐阅读
- django - 给出正确密码时,postgres 显示身份验证失败
- python - 这些 if 语句背后的逻辑是什么?
- sql - 减少像 DISTINCT 这样的重复记录,结果集必须是正确的顺序
- javascript - 如何使用按钮将一行向上移动一排
- javascript - 如何将内联样式添加到 React 组件作为道具?
- c++ - 为什么这些字符串不相等
- xml - OdooV14 - 使用条件属性隐藏网站上的部分
- python - Python 获取 Wifi 信息
- javascript - Javascript函数更改返回值
- python-3.x - 我想使用 3 个独特的数据框创建一个嵌套的 dict/JSON