如何将文本包装到JFXTreeTableView单元格中?将文本包装到JFXTreeTableView单元格中
我的JFoenix TableTreeView列单元格工厂创建如下所示。
// Set column cell factories and width preference
for (JFXTreeTableColumn<LogEntry, String> column : columnList) {
column.setCellFactory(param ->
new GenericEditableTreeTableCell<>(new TextFieldEditorBuilder()));
column.setPrefWidth(100);
}
经过数小时的搜索,我无法弄清楚如何让树表中的单元格包装文本。我甚至试图设置每个GenericEditableTreeTableCell
的换行文字值为true,但我想我也应该调用setWrappingWidth()
方法。我尝试了下面的代码块,但我最终得到了NullPointerException
。
// Set column cell factories and width preference
for (JFXTreeTableColumn<LogEntry, String> column : columnList) {
column.setCellFactory(param -> {
GenericEditableTreeTableCell<LogEntry, String> cell =
new GenericEditableTreeTableCell<>(new TextFieldEditorBuilder());
Text text = (Text) cell.getGraphic();
text.setWrappingWidth(1); //null pointer exception
cell.setWrapText(true);
return cell;
});
column.setPrefWidth(100);
}
于是,我留下了下面的代码块,运行完全正常,并显示表,但细胞不换行。
// Set column cell factories and width preference
for (JFXTreeTableColumn<LogEntry, String> column : columnList) {
column.setCellFactory(param -> {
GenericEditableTreeTableCell<LogEntry, String> cell =
new GenericEditableTreeTableCell<>(new TextFieldEditorBuilder());
// I think I should call setWrappingWidth() on some object here
// but I don't know what object
cell.setWrapText(true);
return cell;
});
column.setPrefWidth(100);
}
用于建立JFXTreeTableView的文档可以找到here。它似乎没有提到任何有关包装单元格文本的内容。
编辑:我试着用CSS做,但没有得到任何结果。事实上,在使用这个CSS代码后,cell.isWrapText()
返回false - 意味着它没有事件将该值设置为true。我知道CSS块正常工作,因为我可以用它来更改每个元素的文本填充颜色。
* {
-fx-wrap-text: true;
}
编辑2:有些人在另一场半决赛相关的职位,滚动窗格可以使节点认为它有一个比什么是显示给用户更大的宽度说。由于JavaFX TreeTableView在表格太大时使用滚动条,我想我会尝试他们的解决方案。我试图设置单元格的首选宽度 - 仍然没有结果。
cell.setWrapText(true);
cell.setPrefWidth(100);
//cell.setMaxWidth(100); doing this too made no difference
//cell.setMinWidth(100); doing this too made no difference
编辑3:我想我知道的问题!看起来行高拒绝让单元格换行文字。如果我将行的最小高度设置为足够大的值,那么单元格会将其文本换行!现在,我只需要知道如何使行高度动态调整以适应单元格,以便包装文本。
编辑4:看来该行不允许换行符,这可能导致单元格无法换行文本。它不能包装文本,因为它创建的新行被删除。
我用一个Java树表来代替,但我打算在不久的将来再给JFXTreeTable一个镜头。然后,我会尝试你的代码,但现在,这看起来像一个坚实的答案,所以我会在同一时间upvote它! – Region39
太好了,谢谢! :) – smashbotica
因此,我终于在今天实现了您的解决方案,但是我陷入了这个过程的一部分。当你重写'TreeAreaEditorBuilder'中的'createNode'方法时,你返回'ControlUtil.styleNodeWithPadding(pane)'。 ControlUtil从哪里来?我在IntelliJ中遇到了一个错误,并且没有提示要导入的任何类。我也找不到任何带有Google搜索的文档。 – Region39