5

I need to have an observable list of a type that will be displayed in a TableView with one single column, that when selected will display the rest of its information on the right. TableView 被包裹在 TitledPane 中,而 TitledPane 被包裹在 Accordion 中。见下图:

在此处输入图像描述

正如您在这种情况下所看到的,我不想显示列标题。

我尝试按照此处的说明进行操作,导致此处

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

但是,它似乎不适用于 JavaFX 8。lookup("TableHeaderRow") 方法返回 null,这让我认为“TableHeaderRow”选择器不再存在。

在 JavaFX 8 中删除/隐藏表头是否有更新的解决方法?

4

5 回答 5

20

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

我创建了一个样式类:

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

并将其添加到 TableView:

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

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

于 2017-02-22T12:34:46.020 回答
9

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

在这种情况下,为了更好的方法,没有标题的单列“表”只是一个ListView. ListView具有类似于用于s的单元格呈现机制TableColumn(但更简单,因为您不必担心多列)。我会ListView在您的场景中使用 a ,而不是破解 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
        }
);
于 2014-11-25T12:45:32.627 回答
4

不需要 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);
    }
}

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

于 2017-06-14T02:39:51.767 回答
3

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

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

这可以在初始化期间执行,上面提到的其他方法如果在初始化期间运行,将返回 null。

于 2017-04-24T10:39:02.180 回答
0

结合最后两个答案以获得更通用的解决方案,而无需覆盖方法,因为 getTableHeaderRow 不再可见,无法访问。使用 Java 11 测试:

private void hideHeaders() {
    table.skinProperty().addListener((a, b, newSkin) ->
    {
      Pane header = (Pane) table.lookup("TableHeaderRow");
      header.setMinHeight(0);
      header.setPrefHeight(0);
      header.setMaxHeight(0);
      header.setVisible(false);
    });
}
于 2022-02-17T16:41:27.757 回答