如何在JavaFX 8中隐藏TableView列标题?

时间:2014-11-25 04:34:19

标签: java javafx tableview columnheader

我需要有一个可观察的类型列表,该列表将显示在带有一个列的TableView中,选中后将在右侧显示其余信息。 TableView包含在TitledPane中,它包含在Accordion中。见下图:

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中的表头?

4 个答案:

答案 0 :(得分:9)

正如评论中所观察到的,直到将CSS应用于节点后,查找才会起作用,这通常在显示节点的第一帧渲染上。只要您在显示表格后执行已发布的代码,您建议的解决方案就可以正常工作。

在这种情况下,为了更好的方法,没有标题的单列“表”只是ListViewListView的{​​{3}}与TableColumn的{​​{1}}类似(但更简单,因为您不必担心多列)。我会在你的场景中使用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
        }
);

答案 1 :(得分:9)

我最近遇到了隐藏列标题的问题,可以使用css解决它。

我创建了一个styleclass:

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

并将其添加到TableView:

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

以防有人需要替代方法。它还提供了切换列标题的灵活性。

答案 2 :(得分:4)

此外,我建议现在使用它。

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

这可以在初始化期间执行,如上所述,如果在初始化期间运行,则返回null。

答案 3 :(得分:3)

不需要CSS或样式或皮肤操作。只需创建TableView的子类并覆盖resize,就像这样

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);
    }
}

截至2017年6月,这在Java 8中运行良好。