2016-10-12 3 views
0

У меня есть узел с несколькими дочерними элементами и хочу, чтобы стрелка свернуть/разворачивать была значком по умолчанию для узла, но у меня есть еще один рисунок, который я бы как поставить рядом со стрелкой. Предоставляет ли дерево JavaFX способ сделать это?JavaFX Treeview - как создать родительский узел с «двумя» графическими объектами

ответ

0

Либо просто передать графику в 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); 
    } 
}); 

Обратите внимание, что для больших деревьев, второй метод имеет потенциал будет намного более эффективным, поскольку он создает только графику (в этом случае два узла) для каждой ячейки , тогда как первый метод создает графики для каждого item в дереве (отображается ли оно или нет). Возможно (я бы решительно возражал), вторая техника имеет лучшее разделение проблем (в первом решении графический элемент является частью данных, что просто неверно).

SSCCE для первой методики:

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 для второго метода:

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); 
    } 
} 

Скриншот (для любой):

enter image description here

Смежные вопросы