繁体   English   中英

如何在 JavaFX 8 中隐藏 TableView 列 header?

[英]How to hide TableView column header in JavaFX 8?

我需要一个类型的可观察列表,该列表将显示在具有单列的 TableView 中,当被选中时,将在右侧显示其信息的 rest。 TableView 包裹在 TitledPane 中,而 TitledPane 又包裹在 Accordion 中。 见下图:

在此处输入图像描述

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

我尝试按照此处的说明进行操作,结果转到此处

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

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

在这种情况下,为了更好的方法,没有标题的单列“表”只是一个ListView ListView有一个单元格渲染机制 ,类似于TableColumn使用的机制 (但更简单,因为您不必担心多列)。 我会在你的场景中使用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
        }
);

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

我创建了一个styleclass:

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

并将其添加到TableView:

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

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

此外,我建议现在使用这个。

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

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

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

这在Java 8中于2017年6月正常运行。

结合最后两个答案以获得更通用的解决方案,而无需覆盖方法,因为 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);
    });
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM