stackPane.setStyle("-fx-padding: 0 0 0 -5;");
// update styles in updateItem method
@Override
public void updateItem(Group item, boolean empty) {
super.updateItem(item, empty);
setText(null);
setGraphic(null);
getStyleClass().remove("just-core-tree-cell");
getStyleClass().remove("core-leaf-tree-cell");
if (empty || null == item) {
return;
}
// i coded a simple method to check if parent item is the root item
// but you can do same with a getTreeItem() parent check instead
boolean isCoreGroup = item.isParentRoot();
boolean isLeaf = item.isLeaf();
if (isCoreGroup && isLeaf) {
getStyleClass().add("core-leaf-tree-cell");
}
if (isCoreGroup && !isLeaf) {
getStyleClass().add("just-core-tree-cell");
}
// Do some other graphical updates on the stack pane...
setGraphic(this.stackPane);
// Set different icon depending on the TreeItem's expanded state as indicator
getTreeItem().setGraphic(iconExpanded);
在CSS样式文件中按如下方式设置填充值
.tree-cell {
-fx-indent: 8.0;
-fx-padding: 0.0 2.0 0.0 -10.0;
}
/* (leafs) indent compensation to the left space*/
.core-leaf-tree-cell {
/* because +18 is the hard coded left space padding, BUG: JDKJDK-8180646
* TreeView renders TreeCells with superfluous indentation if disclosure
* node is not visible or smaller than 18px in width */
-fx-padding: 0 2px 0 -21px;
}
.just-core-tree-cell{
-fx-padding: 0 2px 0 3px;
}
.just-core-tree-cell .tree-disclosure-node, .just-core-tree-cell .arrow, .just-core-tree-cell:expanded .tree-disclosure-node .arrow
{
-fx-rotate: 0;
-fx-scale-shape: true;
-fx-min-width: 0;
-fx-pref-width: 0;
-fx-max-width: 0;
-fx-min-height: 0;
-fx-pref-height: 0;
-fx-max-height: 0;
}
3条答案
按热度按时间f45qwnt81#
箭头是
TreeCell
的disclosureNode
的一部分。如果未指定,则TreeCell
的外观负责提供默认的显示节点(例如三角形)。属性设置程序文档对此进行了说明:要用作“显示”三角形或切换的节点,用于展开和折叠项。这仅在树中的项包含子项的情况下使用。如果未指定,TreeCell的外观实现将负责提供默认显示节点。
然而,看看
TreeCellSkin
,它似乎 * 没有 * 提供默认的公开节点,相反,这似乎是由TreeViewSkin
处理的(在JavaFX 8和JavaFX 11中都有)。看一下这个实现,默认的显示节点是一个StackPane
,它有一个作为实际箭头的子节点StackPane
。它们的样式类是tree-disclosure-node
和arrow
。请注意,这在任何地方都没有文档记录,包括JavaFX CSS Reference Guide。在我看来,隐藏根公开节点最简单、最不容易出错的方法是使用CSS。这里唯一的问题是
TreeCell
没有提供只针对根单元格的方法。但这仍然可以通过将TreeCell
子类化并提供我们自己的PseudoClass
来实现。然后我们在TreeView
上设置cellFactory
。要设置根的图形,请设置根
TreeItem
的TreeItem.graphic
属性。自定义树单元格
CSS文件
1.* 因为我在单元格实现中将
TreeCell.graphic
属性绑定到TreeItem.graphic
属性,所以您将无法从CSS设置图形。您可以修改此属性,以简单地设置图形,而不是绑定,从而启用该功能。这样您就不必通过代码设置根TreeItem
的图形,而是可以设置.custom-tree-cell:root { -fx-graphic: ...; }
。*1.* 这不会移除显示节点,只是使其没有宽度和高度。*
1.* 此解决方案依赖于实施细节;更改JavaFX版本时要小心。我只在JavaFX 11. 0. 2上尝试过,但我相信它也应该适用于JavaFX 8。*
4jb9z9bj2#
我的树细胞皮肤.java
自定义树单元格.java
主要.java
r7s23pms3#
在JavaFX8中,您所需要的只是更新扩展TreeCell中的两个样式类。
在我的TreeCell构造函数中,我使用了StackPane作为图形,并设置了带有反向填充值的样式。
在CSS样式文件中按如下方式设置填充值