[英]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.