在TableColumn(JavaFX)上设置工具提示而不产生副作用

在TableColumn(JavaFX)上设置工具提示而不产生副作用,java,javafx,Java,Javafx,有一种方法可以这样设置工具提示 if (tooltipText != null) { Label lb = new Label(column.getText()); lb.setTooltip(new Tooltip(tooltipText)); column.setText(null); column.setGraphic(lb); } 不幸的是,这样会存在丑陋的副作用 我们将null设置为列的文本,但menuItems调用column.getText()。

有一种方法可以这样设置工具提示

if (tooltipText != null) {
    Label lb = new Label(column.getText());
    lb.setTooltip(new Tooltip(tooltipText));
    column.setText(null);
    column.setGraphic(lb);
}
不幸的是,这样会存在丑陋的副作用

我们将null设置为列的文本,但menuItems调用column.getText()。如果我们不这样做,标题中会出现双重名称。如何解决?假设通过css

这个答案并不能消除副作用
注意:以下代码依赖于
表视图的内部结构。这些可能会发生更改,因为它们位于
com.sun
包中

CSS查找可用于在
TableView
上的第一次布局传递之后访问
TableColumnHeader
节点。这些可用于检索用于显示
表格列
文本
属性的
标签

@Override
public void start(Stage primaryStage) {
    TableView tv = createTableView();

    Scene scene = new Scene(tv);
    
    // generate layout pass
    tv.applyCss();
    tv.layout();

    // assign tooltips to headers
    tv.lookupAll(".column-header").stream().forEach(n -> {
        TableColumnHeader header = (TableColumnHeader) n;
        Tooltip tooltip = new Tooltip("Tooltip: " + header.getTableColumn().getText());
        ((Control) header.lookup(".label")).setTooltip(tooltip);
    });

    primaryStage.setScene(scene);
    primaryStage.show();
}