2016-11-25 5 views
0

Я поддержал себя в углу, используя CheckBoxTreeItem, потому что я хочу, чтобы он предоставлял функциональность (возможность проверки всех дочерних элементов, если установлен родительский элемент), но мой родитель имеет Hyperlink в качестве графические, тогда как мои дети имеют Strings в качестве графика. Java не нравится, когда у вас есть TreeView, который содержит два разных типа (CheckBoxTreeItem<Hyperlink> и CheckBoxTreeItem<String>). Мои параметры состоят в том, чтобы создать TreeView, который принимает общий тип, или найти способ отображения Hyperlinks в виде обычного текста. Я пару раз использовал инструмент с общим типом, но не могу заставить его работать. Я больше склоняюсь к модификации гиперссылок, но я буду благодарен за советы в любом случае.TreeView, содержащий разные типы

ответ

0

Если вы хотите добавить Node тип, вы можете использовать graphic недвижимость TreeItem.

@Override 
public void start(Stage primaryStage) { 
    CheckBoxTreeItem<String> item = new CheckBoxTreeItem<>(null, new Hyperlink("abc")); 
    CheckBoxTreeItem<String> item2 = new CheckBoxTreeItem<>("Hello World"); 
    CheckBoxTreeItem<String> item3 = new CheckBoxTreeItem<>("42"); 
    item.getChildren().setAll(item2, item3); 

    TreeView<String> treeView = new TreeView<>(item); 
    treeView.setCellFactory(CheckBoxTreeCell.forTreeView()); 

    Scene scene = new Scene(treeView); 

    primaryStage.setScene(scene); 
    primaryStage.show(); 
} 

В качестве альтернативы, если значение TreeItem содержит Node, вам необходимо изменить метод updateItem из CheckBoxTreeCell немного:

CheckBoxTreeItem<Object> item = new CheckBoxTreeItem<>(new Hyperlink("abc")); 
CheckBoxTreeItem<Object> item2 = new CheckBoxTreeItem<>("Hello World"); 
CheckBoxTreeItem<Object> item3 = new CheckBoxTreeItem<>("42"); 
CheckBoxTreeItem<Object> item4 = new CheckBoxTreeItem<>(new Hyperlink("def")); 
item.getChildren().setAll(item2, item3, item4); 

TreeView<Object> treeView = new TreeView<>(item); 
treeView.setCellFactory(tv -> new CheckBoxTreeCell<Object>() { 

    private final HBox graphicWrapper = new HBox(); 

    { 
     graphicWrapper.setAlignment(Pos.BASELINE_LEFT); 
    } 

    @Override 
    public void updateItem(Object item, boolean empty) { 
     graphicWrapper.getChildren().clear(); 
     super.updateItem(item, empty); 

     if (!empty && (item instanceof Node)) { 
      // replace graphic & text 
      setText(null); 
      graphicWrapper.getChildren().setAll(getGraphic(), (Node) item); 
      setGraphic(graphicWrapper); 
     } 
    } 

}); 
+0

Ходили с методом номер один. Работал как шарм. Для чтения обязательно включите строку setCellFactory. В противном случае вы получите TreeView только строк, без CheckBoxes. – mpowell48

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