我需要有一个可观察的类型列表,该列表将显示在带有一个列的TableView中,选中后将在右侧显示其余信息。 TableView包含在TitledPane中,它包含在Accordion中。见下图:
正如您在本场景中所看到的,我不想显示列标题。
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中的表头?
答案 0 :(得分:9)
正如评论中所观察到的,直到将CSS应用于节点后,查找才会起作用,这通常在显示节点的第一帧渲染上。只要您在显示表格后执行已发布的代码,您建议的解决方案就可以正常工作。
在这种情况下,为了更好的方法,没有标题的单列“表”只是ListView
。 ListView
的{{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中运行良好。