2014-11-05 3 views
2

Я пытаюсь создать индивидуальный TreeView с помощью CellFactory и Css.Настройка Treecell: размещение значка стрелки

Это то, что я до сих пор:

What I have so far

Я хочу, чтобы центрировать стрелку так, чтобы она указывала на середину TreeCell.

Проблема в том, что я не знаю как. Я попробовал дополнение, но это только масштабирует значок.

Возможно, стоит упомянуть, что стрелка не является частью HBox, которую я загружаю, чтобы представлять treeCell.

Вот мой CSS:

.tree-cell{ 
-fx-content-display: CENTER; 
-fx-position-shape: true; 
-fx-background-color: linear-gradient(#c9e9d1 20%, #9dbda5 80%); 
} 
.tree-cell .tree-disclosure-node .arrow { 
    -fx-background-color: #facf46; 
    -fx-padding: 0.666666em; /* 4 */ 
    -fx-shape: "M 0 -4 L 4 0 L 0 4 z"; 
    -fx-content-display: center; 
} 

.tree-cell:expanded .tree-disclosure-node .arrow { 
    -fx-content-display: center; 
    -fx-background-color: #facf46, 


    -fx-rotate: 90; 
} 

.tree-cell:hover { 
    -fx-background-color: #dfffe7; 
} 

.tree-cell:selected{ 
    -fx-background-color: #4f88da; 
} 

В этих двух ссылок, есть код, как я представляю TreCells по HBox:

Customizing TreeCells using cell factory JavaFX TreeView: setGraphic() for different levels of treeItem

+0

Можете ли вы поделиться код? –

+0

Редактировали, чтобы включить код. – AnagramOfJoans

+0

Одним из способов, с помощью которого вы можете вертикально центрировать все элементы, является установка 'display: table' в родительском контейнере, который, я считаю, является' .tree-cell', а затем устанавливает 'display: table-cell, vertical-align: niddle' на всех его дочерних элементах. В любом случае, можно ли его просматривать на каком-либо веб-сайте, чтобы можно было отлаживать CSS? –

ответ

1

Решение, которое я нашел для этого требуется зная высоту hbox. Предположим, мы установили высоту pref 80px.

Во-первых, сразу же после показа сцены на методе start(), мы ищем узел со стрелкой, которая является StackPane, и установить его свойства:

public void start(Stage primaryStage) { 
    ... 
    primaryStage.show(); 

    StackPane sp=(StackPane)tree.lookup(".tree-disclosure-node"); 
    sp.setPrefSize(80,80); 
    sp.setAlignment(Pos.CENTER); 
    sp.setPadding(new Insets(20)); 
} 

Это не достаточно, так как на updateItem() метод пользовательской ячейки, после добавления горизонтального бокса, ячейка содержит также StackPane, который переопределен каждый раз этот метод вызывается, так что мы должны получить этот стек панель и установить то же свойство, снова:

@Override 
public void updateItem(String item, boolean empty) { 
    super.updateItem(item, empty); 
    if (item != null) { 
     if (getTreeView().getTreeItemLevel(getTreeItem())==1) { 
      setGraphic(this.hBox); 
     }else if (getTreeView().getTreeItemLevel(getTreeItem())==2){ 
      setGraphic(this.hBoxLeaf); 
     } 
     // look for the StackPane 
     this.getChildrenUnmodifiable().stream().filter(StackPane.class::isInstance) 
       .forEach(p->{ 
        StackPane sp=(StackPane)p; 
        sp.setPrefSize(80,80); 
        sp.setAlignment(Pos.CENTER); 
        sp.setPadding(new Insets(20)); 
       }); 
    } else { 
     setGraphic(null); 
    } 
} 

Нам не нужны какие-либо дополнительные свойства CSS, так что это достаточно:

.tree-cell{ 
    -fx-background-color: linear-gradient(#c9e9d1 20%, #9dbda5 80%); 
} 

.tree-cell .tree-disclosure-node .arrow { 
    -fx-background-color: #facf46; 
    -fx-shape: "M 0 -4 L 4 0 L 0 4 z"; 
} 

.tree-cell:expanded .tree-disclosure-node .arrow { 
    -fx-rotate: 90; 
} 
.tree-cell:hover { 
    -fx-background-color: #dfffe7; 
} 
.tree-cell:selected{ 
    -fx-background-color: #4f88da; 
} 

Наконец, мы получаем что-то вроде этого:

Centered arrow on custom cell

+0

Я проверю, работает ли это, как только я получу время и вернусь, чтобы отредактировать этот комментарий :) Спасибо! – AnagramOfJoans