如何在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,但没有得到任何结果。实际上,cell.isWrapText()
在使用此CSS代码后返回false - 这意味着它没有将事件值设置为true。我知道CSS的块正常工作,因为我可以用它来改变每个元素的文本填充颜色。
* {
-fx-wrap-text: true;
}
编辑2:有些人在其他半相关帖子中说滚动窗格可能会导致Node认为它的宽度比显示给用户的宽度大得多。由于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:该行似乎不允许换行,这可能是导致单元格无法换行的原因。它不能包装文本,因为它创建的新行被扼杀。
答案 0 :(得分:1)
我使用了你的一种方法,但也制作了自定义的EditorBuilder,它有JFXTextArea而不是JFXTextField。
自定义TextAreaEditorBuilder如下:
public class TextAreaEditorBuilder implements EditorNodeBuilder<String> {
private JFXTextArea textArea;
@Override
public void startEdit() {
Platform.runLater(() -> {
textArea.selectAll();
});
}
@Override
public void cancelEdit() {
}
@Override
public void updateItem(String s, boolean isEmpty) {
Platform.runLater(() -> {
textArea.selectAll();
textArea.requestFocus();
});
}
@Override
public Region createNode(
String value,
DoubleBinding minWidthBinding,
EventHandler<KeyEvent> keyEventsHandler,
ChangeListener<Boolean> focusChangeListener) {
StackPane pane = new StackPane();
pane.setStyle("-fx-padding:-10 0 -10 0");
textArea = new JFXTextArea(value);
textArea.setPrefRowCount(4);
textArea.setWrapText(true);
textArea.minWidthProperty().bind(minWidthBinding.subtract(10));
textArea.setOnKeyPressed(keyEventsHandler);
textArea.focusedProperty().addListener(focusChangeListener);
pane.getChildren().add(textArea);
return ControlUtil.styleNodeWithPadding(pane);
}
@Override
public void setValue(String s) {
textArea.setText(s);
}
@Override
public String getValue() {
return textArea.getText();
}
@Override
public void validateValue() throws Exception {
}
}
然后您的列的配置如下:
negativeCasingColumn.setCellFactory(param -> {
TextAreaEditorBuilder textAreaEditorBuilder = new TextAreaEditorBuilder();
GenericEditableTreeTableCell<DiagnosticMethodFX, String> cell
= new GenericEditableTreeTableCell<>(textAreaEditorBuilder);
cell.setWrapText(true);
return cell;
});
所以基本上我包裹了单元格,但确保我使用TextArea作为编辑字段。对我来说这很好用,但是如果你想要更优雅的解决方案,你可以查看 GenericEditableTreeTableCell 中的 cancelEdit()方法,它将内容显示设置为仅文本: setContentDisplay(ContentDisplay.TEXT_ONLY),它是抽象类Labeled中内容属性的设置,其中文本换行设置为false。我没有深入挖掘它,但可以确定一些解决方法。