gpt4 book ai didi

javafx:如何在 TreeView 中隐藏 "drop down arrow"?

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:31:18 25 4
gpt4 key购买 nike

希望大家一切都好。

我的问题很简单:如果可能的话,如何隐藏 TreeView 根部的箭头?在 Windows 事件查看器中可以看到我想要实现的一个很好的例子。

enter image description here

虽然我的 javafx 应用程序如下图所示

enter image description here

默认情况下,车辆旁边的箭头存在。

我阅读了文档 here ,但我只找到了 .showRoot(),它没有达到我想要的效果。我真的很感激任何输入,即使这是一种作弊方式(使用 x-offset 属性在我脑海中闪过)。

最佳答案

箭头是 disclosureNode 的一部分TreeCell 的。当未指定时,TreeCell 的皮肤负责提供默认的公开节点(例如三角形)。 property-setter 文档说明了这一点:

The node to use as the "disclosure" triangle, or toggle, used for expanding and collapsing items. This is only used in the case of an item in the tree which contains child items. If not specified, the TreeCell's Skin implementation is responsible for providing a default disclosure node.

但查看 TreeCellSkin 似乎提供默认公开节点。相反,这似乎由 TreeViewSkin(在 JavaFX 8 和 JavaFX 11 中)处理。查看实现,默认公开节点是一个 StackPane 和一个子 StackPane ,用作实际箭头。它们的样式类分别是tree-disclosure-nodearrow。请注意,这不会出现在任何地方,包括 JavaFX CSS Reference Guide .

在我看来,隐藏根披露节点的最简单且最不容易出错的方法是使用 CSS。这里唯一的问题是 TreeCell 无法提供仅针对根单元格的方法。但这仍然可以通过子类化 TreeCell 并提供我们自己的 PseudoClass 来实现。 .然后我们设置 cellFactory在我们的 TreeView 上。

要设置根的图形,请设置 TreeItem.graphicTreeItem 的属性。


自定义树单元格

import javafx.beans.InvalidationListener;
import javafx.css.PseudoClass;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeView;
import javafx.util.Callback;

public class CustomTreeCell<T> extends TreeCell<T> {

private static final PseudoClass ROOT = PseudoClass.getPseudoClass("root");

public static <T> Callback<TreeView<T>, TreeCell<T>> forTreeView() {
return treeView -> new CustomTreeCell<>();
}

public CustomTreeCell() {
getStyleClass().add("custom-tree-cell");

InvalidationListener listener = observable -> {
boolean isRoot = getTreeView() != null && getTreeItem() == getTreeView().getRoot();
pseudoClassStateChanged(ROOT, isRoot);
};

treeViewProperty().addListener(listener);
treeItemProperty().addListener(listener);
}

@Override
protected void updateItem(T item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
graphicProperty().unbind();
setGraphic(null);
} else {
setText(item.toString()); // Really only works if item is a String. Change as needed.
graphicProperty().bind(getTreeItem().graphicProperty());
}
}

}

CSS 文件

.custom-tree-cell:root .tree-disclosure-node,
.custom-tree-cell:root .arrow {

-fx-min-width: 0;
-fx-pref-width: 0;
-fx-max-width: 0;

-fx-min-height: 0;
-fx-pref-height: 0;
-fx-max-height: 0;

}

/* Related to question asked in the comments by OP */
.custom-tree-cell > .tree-disclosure-node > .arrow {
-fx-shape: "M 0 0 L 10 5 L 0 10 L 0 8 L 8 5 L 0 2 Z";
}

一些注意事项:

  1. 由于我在我的单元格实现中将 TreeCell.graphic 属性绑定(bind)到 TreeItem.graphic 属性,您将无法通过 CSS 设置图形.您可以修改它以简单地设置图形,而不是绑定(bind),以启用该功能。然后你不必通过代码设置根 TreeItem 的图形,但可以做 .custom-tree-cell:root { -fx-graphic: ...; .
  2. 这不会删除公开节点,它只会使其没有宽度和高度。
  3. 此解决方案依赖于实现细节;更改 JavaFX 版本时要小心。我只在 JavaFX 11.0.2 上试过这个,但我相信它也适用于 JavaFX 8。

关于javafx:如何在 TreeView 中隐藏 "drop down arrow"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54953447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com