0
私はいくつかの子を持つノードを持っていて、ノードのデフォルトアイコンである折りたたみ/展開矢印を保持したいが、矢印のすぐ隣に置くのが好きです。 JavaFXツリービューでこれを行う方法はありますか?JavaFXツリービュー - "2つの"グラフィックで親ノードを作成する方法
私はいくつかの子を持つノードを持っていて、ノードのデフォルトアイコンである折りたたみ/展開矢印を保持したいが、矢印のすぐ隣に置くのが好きです。 JavaFXツリービューでこれを行う方法はありますか?JavaFXツリービュー - "2つの"グラフィックで親ノードを作成する方法
いずれちょうどTreeItem
にグラフィックを渡す:
TreeItem<String> root = new TreeItem<>("Root", new Rectangle(16, 16, Color.CORAL));
等
またはセルファクトリーを使用する:
TreeView<String> tree = new TreeView<>();
tree.setCellFactory(tv -> new TreeCell<String>() {
private final Node graphic = new Rectangle(16, 16, Color.CORAL);
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setGraphic(empty ? null : graphic);
setText(empty ? null : item);
}
});
注大きな木のために、第二の技術が有しますこれは、それぞれセルのグラフィック(この場合は2つのノード)を作成するだけなので、はるかに効率的です。最初の手法では、アイテムのすべてのグラフィックスがツリー内に作成されます(表示されているかどうかにかかわらず)。間違いなく(私は強く主張するだろう)、第2のテクニックは懸念のよりよい分離を持っています(最初の解決策ではグラフィックはデータの一部ですが、これはまったく間違っています)。第一の技術のための
SSCCE:
import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.TreeCell;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class TreeGraphicTest extends Application {
@Override
public void start(Stage primaryStage) {
TreeItem<String> root = new TreeItem<>("Root");
for (int i = 1 ; i <= 3 ; i++) {
root.getChildren().add(new TreeItem<>("Child "+i));
}
TreeView<String> tree = new TreeView<>(root);
tree.setCellFactory(tv -> new TreeCell<String>() {
private final Node rootGraphic = new Rectangle(16, 16, Color.CORAL) ;
private final Node childGraphic = new Rectangle(16, 16, Color.CORNFLOWERBLUE) ;
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setGraphic(empty ? null : getTreeItem() == root ? rootGraphic : childGraphic);
setText(empty ? null : item);
}
});
primaryStage.setScene(new Scene(tree));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
スクリーン(のためのいずれか):
第二の技術のためのimport javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
public class TreeGraphicTest extends Application {
@Override
public void start(Stage primaryStage) {
TreeItem<String> root = new TreeItem<>("Root", new Rectangle(16, 16, Color.CORAL));
for (int i = 1 ; i <= 3 ; i++) {
root.getChildren().add(new TreeItem<>("Child "+i, new Rectangle(16, 16, Color.CORNFLOWERBLUE)));
}
TreeView<String> tree = new TreeView<>(root);
primaryStage.setScene(new Scene(tree));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
SSCCE