2016-05-10 13 views
1

私は3レベルのTreeTableIViewを持っています。他のすべてのセルは空のままですが、リーフだけにチェックボックスを表示したいと思います。これまでのところ、私は2列を作成しました:JavaFXのLeafs of TreeTableViewのチェックボックスのみ

最初の列は階層を保持している:

 TreeTableColumn<AttributeRow, String> attributeColumn = new TreeTableColumn<>("Attributes"); 
     attributeColumn.setPrefWidth(200); 
     attributeColumn.setCellValueFactory(
      (TreeTableColumn.CellDataFeatures<AttributeRow, String> param) -> 
       new ReadOnlyStringWrapper(param.getValue().getValue().getAttributeName()) 
     ); 

二列だけ葉のチェックボックスを含まなければならない:

  TreeTableColumn<AttributeRow, Boolean> companyColumn = new TreeTableColumn<>(companyGroup); 
      companyColumn.setPrefWidth(200); 
      companyColumn.setCellFactory(CheckBoxTreeTableCell.forTreeTableColumn(companyColumn)); 
      companyColumn.setCellValueFactory(param -> { 
       if (param.getValue().getValue().getCompanyGroups() == null) { 
        return new SimpleBooleanProperty(true); 
       } else {     

        return new SimpleBooleanProperty(false); 
       } 
      }); 

これは私が何をしたいです達成するために:

enter image description here

があります他のセルは空ですが、リーフのチェックボックスのみを表示する方法はありますか?ありがとう!それが含まれている項目が葉かではなく、leaf疑似クラスを追加または削除する場合

答えて

4

あなたは、チェックカスタムrowFactoryを使用することができます。

private static final PseudoClass LEAF = PseudoClass.getPseudoClass("leaf"); 

... 

treeTableView.setRowFactory(view -> new TreeTableRow<BoolItem>() { 

    { 
     ChangeListener<Boolean> listener = (observable, oldValue, newValue) -> { 
      pseudoClassStateChanged(LEAF, newValue); 
     }; 
     treeItemProperty().addListener((observable, oldItem, newItem) -> { 
      if (oldItem != null) { 
       oldItem.leafProperty().removeListener(listener); 
      } 
      if (newItem != null) { 
       newItem.leafProperty().addListener(listener); 
       listener.changed(null, null, newItem.isLeaf()); 
      } else { 
       listener.changed(null, null, Boolean.FALSE); 
      } 
     }); 
    } 

}); 

Furthemoreは、細胞の作成に加えて、そのカスタムcellFactoryを使用しますそれが葉ではない場合にも、あなたは隠されるべきセルとしてそれを識別することができますそれにスタイルクラスを割り当てます。

companyColumn.setCellFactory((TreeTableColumn<AttributeRow, Boolean> param) -> { 
    CheckBoxTreeTableCell<AttributeRow, Boolean> cell = new CheckBoxTreeTableCell<>(); 
    cell.getStyleClass().add("hide-non-leaf"); 
    return cell; 
}); 

これは、CSSスタイルシートから適切な細胞を非表示にすることができます:

.tree-table-row-cell .hide-non-leaf * { 
    /* invisible by default */ 
    visibility: hidden; 
} 

.tree-table-row-cell:leaf .hide-non-leaf * { 
    /* make visible, if leaf */ 
    visibility: visible; 
} 

編集: JavaFXのは、CSSスタイルをオーバーライドする細胞インラインの可視性を設定しているようだいくつかの理由。したがって、細胞の子供たちは、細胞そのものの代わりに目に見えなくなります。

+0

お返事ありがとうございます。私はあなたのソリューションを実装し、それは部分的に動作します。ただし、1つのチェックボックスをクリックすると、上記のチェックボックスが突然表示されたまま消えます。だからここには奇妙な動きがあります。 – user41854

+0

@ user41854正確な問題を再現できませんでしたが、最も関連性の高いものが見つかりました:何らかの理由で、 'TreeTableView'は、セルが再び表示されるとセルの可視性を' true'に設定してCSSスタイルをオーバーライドし、これは、細胞を再び見るためにスクロールした後、それらが可視になることを意味する。回避策を追加しました(セルの下地をセル自体の代わりに見えなくする)。現在のバージョンはjava 8u92以降で動作するはずです。 – fabian

関連する問題