JavaFXの:どのように私は、ツリービューで、「ドロップダウン矢印を」隠すのですか?

geekTechnique:

ホープ誰もがよくやっています。

私の質問はかなり基本的である:それは可能ですかどうかはどのように、隠されたツリービューのルートにある矢印を作るのですか?私が達成したいものの良い例では、Windowsイベントビューアで見ることができます。

ここでは、画像の説明を入力します。

下の画像のような私のJavaFXアプリケーション見えますが

ここでは、画像の説明を入力します。

車の横にある矢印デフォルトでは、存在しています。

私は、ドキュメントを読んで、ここで、私は唯一の私が望むものを達成しない.showRootを()、発見しました。私は実際にそれが(X-オフセットプロパティを使用すると、私の心を交差させ)、それを行うためのチート方法だ場合でも、任意の入力をお願い申し上げます。

なスロー:

矢印は、の一部であるdisclosureNodeTreeCell指定されていないとき、それはの責任であるTreeCellの皮膚デフォルトの開示ノードを提供するために、(例えば三角形)。これは、プロパティセッターのドキュメントで記載されています。

アイテムを拡大し、崩壊のために使用される「公開」三角形、またはトグルとして使用するノード。これが唯一の子項目が含まれているツリー内の項目の場合に使用されています。指定されていない場合は、treecell要素のスキン実装では、デフォルトの開示のノードを提供する責任があります。

まだ見てTreeCellSkin、表示されていないデフォルトの開示ノードを提供しています。その代わりに、これはによって処理されると思われるTreeViewSkin(JavaFXの8とのJavaFX 11の両方で)。実装を見てみると、デフォルトの開示ノードであるStackPane子とStackPaneその実際の矢印として機能します。自分のスタイルクラスがあるtree-disclosure-nodearrow、それぞれ。これは含めて、どこにも文書化されて表示されないことに注意JavaFXのCSSリファレンスガイド

ルート開示ノードを非表示にする最も簡単で最もバグが発生しやすい方法は、CSSを使用することが、私の意見では、あります。ここでの唯一の問題は、あるTreeCellルートのみセルを対象とする方法を提供していません。しかし、これはまだサブクラス化することによって達成することができるTreeCellと私たち自身を提供しますPseudoClassその後、我々は設定されcellFactory、私たちにTreeView

設定されたルートのグラフィック設定するには、TreeItem.graphicルートのプロパティをTreeItem


CustomTreeCell

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のプロパティTreeItem.graphicの私のセルの実装でプロパティを使用するには、CSSからグラフィックを設定することはできません。あなたは、単にその機能を有効にするためには、むしろバインドよりも、グラフィックを設定するには、これを変更することができます。その後、根のグラフィックを設定する必要はありませんTreeItem、コードをしかし行うことができます.custom-tree-cell:root { -fx-graphic: ...; }
  2. これは開示ノードを削除しません、それはちょうどそれが何の幅と高さがないを持っていないことができます。
  3. このソリューションは、実装の詳細に依存しています。JavaFXのバージョンを変更するときに注意してください。私はJavaFXの11.0.2でこれを試みたが、私はそれがうまくとしてJavaFXの8のために働くべきだと考えています。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=208202&siteId=1