2017-09-01 7 views
2

JFXTreeTableViewセルにテキストをラップするにはどうすればよいですか?JFXTreeTableViewセルのテキストを折り返す

My 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:一部の人々はスクロールペインがノードは、それがユーザーに示されているものよりもはるかに大きな幅を持っていると思うことがあります他の半関連記事にしました。 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

私はあなたのアプローチの1つを使用しましたが、JFXTextFieldではなくJFXTextAreaを持つカスタムEditorBuilderを作成しました。

カスタム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

関連する問題