【发布时间】:2018-09-30 02:23:38
【问题描述】:
我使用此代码 sn-p 为我通过单元工厂传播的每个 tableView 单元创建工具提示:
private <T> void addFileTooltipToCells(TableColumn<FileTableBean,T> column) {
Callback<TableColumn<FileTableBean, T>, TableCell<FileTableBean,T>> existingCellFactory = column.getCellFactory();
column.setCellFactory(c -> {
TableCell<FileTableBean, T> cell = existingCellFactory.call(c);
Tooltip tooltip = new Tooltip();
tooltip.textProperty().bind(cell.itemProperty().asString());
tooltip.setShowDuration(Duration.seconds(30));
tooltip.setStyle("-fx-font-size: 12");
cell.setTooltip(tooltip);
return cell;
});
}
问题是工具提示有时可能包含大量数据并且应该是多行的。从这里我发现应该简单地用
包装工具提示,并可能在必要时设置。但是,上面在某处仔细复制并经过试错测试的代码 sn-p 不喜欢这个想法。我试过了:
tooltip.textProperty().bind("<html>"+cell.itemProperty().asString()+"</html>");
tooltip.setText("<html>"+cell.itemProperty().asString()+"</html>");
首先在IDE中说:不兼容的String不能转换为ObservableValue 第二个生成器遵循工具提示:“字符串绑定 [无效]”:)
在有人开始使用通常的“错误消息说明一切,请阅读”之前,我知道可能有一个简单的答案,但是将这些 lambdas 与绑定概念和 cellfactories 结合起来,我只有放弃并尝试从这里获得一些指导。
【问题讨论】:
-
看看 ControlsFx PopOver 是不是更适合在这里使用的节点。
-
请提供一个minimal reproducible example 来说明问题。
-
wrapText+prefWidth怎么样?html部分应该如何解决任何问题?如果您真的想显示包含这些子字符串的字符串,请使用Bindings.concat("<html>", cell.itemProperty(), "</html>")创建ObservableValue<String>,而不是String,因为bind不允许作为参数。 -
感谢@fabian,我在阅读工具提示文档时错过了 wrapText 部分。 html 的想法来自以下几个主题: [link|(stackoverflow.com/questions/868651/multi-line-tooltips-in-java) 此外,我对 StackOverflow 最近的水平有点失望。你需要非常小心,不要问一个“愚蠢的问题”,否则你会被遗忘或垃圾邮件同样的“请提供最少的blablabla”。上面的代码 sn-p 足以让 Fabian 给我很好的答案。当问题与少数人真正相关时,无需发送数百行代码
-
请注意,您链接到的问题与工具提示等支持 HTML 内容的 Swing 有关。 JavaFX 的控件(例如
Tooltip、Label、TextArea等)不支持 HTML(至少,它们的默认外观不支持)。这就是 HTML 标记不起作用的原因。
标签: javafx tableview tooltip bind factory