2014-11-25 857 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