2014-11-25 865 views
3

我需要一個可觀察的列表,這些列表將顯示在一個TableView中,並且只有一列,選中時將在右側顯示其餘信息。 TableView被封裝在一個TitledPane中,它被包裹在一個Accordion中。請參見下面的圖片:如何在JavaFX 8中隱藏TableView列標題?

enter image description here

正如你在這種情況下看我不希望顯示的列標題。

我試過之後的指令here,從而導致here

Pane header = (Pane) list.lookup("TableHeaderRow"); 
header.setMaxHeight(0); 
header.setMinHeight(0); 
header.setPrefHeight(0); 
header.setVisible(false); 

然而,似乎沒有工作JavaFX的8查找(「TableHeaderRow」)方法返回null這讓我覺得「TableHeaderRow」選擇器不再存在。

是否有更新的解決方法來刪除/隱藏JavaFX 8中的表頭?

+2

你能使用'ListView'而不是'TableView',因爲你只有一列? – 2014-11-25 05:19:27

+1

我可以驗證** lookup id **在JavaFX 8中仍然可用。是否將'list'引用到'TableView'? – ItachiUchiha 2014-11-25 05:27:02

+0

@James_D我可以,但是我有一張需要處理的相冊列表,如果選擇了一個相冊,相冊對象的其餘部分需要從表格傳遞到右側窗格。 TableView直接與對象一起工作,而ListView會要求我將相冊名稱和索引分別與對象分開。如果我錯了,請賜教,謝謝。 – user3804927 2014-11-25 06:41:13

回答

7

正如在註釋中所觀察到的,直到將CSS應用於節點(通常位於顯示節點的第一幀渲染)之後,查找才起作用。只要您執行顯示錶格後發佈的代碼,您建議的解決方案就可以正常工作。

爲了在這種情況下更好的方法,沒有標題的單列「表」只是一個ListViewListView有一個cell rendering mechanism,它類似於TableColumn s(但更簡單,因爲您不必擔心多列)。我會在你的情況下使用ListView,而不是黑客的CSS使頭部消失:

ListView<Album> albumList = new ListView<>(); 
albumList.setCellFactory((ListView<Album> lv) -> 
    new ListCell<Album>() { 
     @Override 
     public void updateItem(Album album, boolean empty) { 
      super.updateItem(album, empty); 
      if (empty) { 
       setText(null); 
      } else { 
       // use whatever data you need from the album 
       // object to get the correct displayed value: 
       setText(album.getTitle()); 
      } 
     } 
    } 
); 

albumList.getSelectionModel().selectedItemProperty() 
    .addListener((ObservableValue<? extends Album> obs, Album oldAlbum, Album selectedAlbum) -> { 
     if (selectedAlbum != null) { 
      // do something with selectedAlbum 
     } 
); 
+0

謝謝你的澄清。我不知道細胞工廠,所以一旦我瞭解它如何工作,這看起來更簡單。乾杯! – user3804927 2014-11-25 21:09:43

+0

downvoted,不回答原來的問題,請回答這個問題,然後建議一個更好的方法來解決他們的問題,然後將upvote,謝謝。 – Troyseph 2015-06-22 20:40:03

+1

它實際上解決了問題中提出的問題,它清楚地表明他需要一個沒有標題的列。如果您的問題不同,請將其作爲一個新問題。 – 2015-06-22 23:35:38

3

我躲在面臨的列標題最近的問題,使用CSS可以解決這個問題。

我創建一個styleClass:

.noheader .column-header-background { 
    -fx-max-height: 0; 
    -fx-pref-height: 0; 
    -fx-min-height: 0; 
} 

,並把它添加到的TableView:

tableView.getStyleClass().add("noheader"); 

萬一有人需要一種替代方法。它還提供了切換列標題的靈活性。

+0

如果在tableView init期間使用返回null。調用,只有在TableView被渲染後。 – zIronManBox 2017-04-24 10:39:27

0

此外,我會建議使用這個時下。

tableView.skinProperty().addListener((a, b, newSkin) -> { TableHeaderRow headerRow = ((TableViewSkinBase) newSkin).getTableHeaderRow(); ... });

這可以在初始化過程中被執行,另一種方法如上述提及的,將返回null,如果初始化期間運行。

1

不需要CSS或樣式或皮膚操作。只是讓TableView中的一個子類,並覆蓋調整,這樣

class XTableView extends TableView { 
    @Override 
    public void resize(double width, double height) { 
     super.resize(width, height); 
     Pane header = (Pane) lookup("TableHeaderRow"); 
     header.setMinHeight(0); 
     header.setPrefHeight(0); 
     header.setMaxHeight(0); 
     header.setVisible(false); 
    } 
} 

這在Java中工作正常截至6月2017 8