2017-09-01 56 views
2

如何将文本包装到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:看来该行不允许换行符,这可能导致单元格无法换行文本。它不能包装文本,因为它创建的新行被删除。

回答

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作为编辑字段。对我来说,这个工作得很好,但如果你想更好的解决方案也许你可以检查的CancelEdit()方法GenericEditableTreeTableCell,在那里将内容显示为纯文本:setContentDisplay(ContentDisplay.TEXT_ONLY)这是设置抽象类Labeled中的内容属性,其中文本换行设置为false。我没有深入研究它,但可以肯定地做出一些解决方法。

+0

我用一个Java树表来代替,但我打算在不久的将来再给JFXTreeTable一个镜头。然后,我会尝试你的代码,但现在,这看起来像一个坚实的答案,所以我会在同一时间upvote它! – Region39

+1

太好了,谢谢! :) – smashbotica

+0

因此,我终于在今天实现了您的解决方案,但是我陷入了这个过程的一部分。当你重写'TreeAreaEditorBuilder'中的'createNode'方法时,你返回'ControlUtil.styleNodeWithPadding(pane)'。 ControlUtil从哪里来?我在IntelliJ中遇到了一个错误,并且没有提示要导入的任何类。我也找不到任何带有Google搜索的文档。 – Region39

相关问题