2017-09-01 59 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

相關問題