2017-09-01 4 views
2

Wie kann ich den Text in JFXTreeTableView-Zellen umbrechen?Text in JFXTreeTableView-Zellen umbrechen

Meine JFenix ​​TableTreeView-Säulenzelle wird wie unten gezeigt erstellt.

Nach Stunden der Suche kann ich nicht herausfinden, wie man die Zellen in der Baumtabelle bekommt, um Text zu wickeln. Ich habe sogar versucht, den Wrap-Text-Wert für jede GenericEditableTreeTableCell auf True zu setzen, aber ich denke, ich sollte auch die setWrappingWidth() Methode auf etwas aufrufen. Ich habe den folgenden Codeblock ausprobiert, aber am Ende habe ich eine NullPointerException bekommen.

// 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); 
    } 

Also, ich bin mit dem folgenden Code-Block links, die völlig in Ordnung läuft und zeigt die Tabelle, aber die Zellen umhüllen keinen Text.

// 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); 
    } 

Die Dokumentation für eine JFXTreeTableView Einrichtung kann here finden. Es scheint nichts über das Umhüllen von Zelltext zu sagen.

Bearbeiten: Ich habe versucht, es mit CSS zu tun, aber habe keine Ergebnisse erhalten. Tatsächlich hat die cell.isWrapText() nach Verwendung dieses CSS-Codes den Wert false zurückgegeben - was bedeutet, dass das Ereignis nicht den Wert true festgelegt hat. Ich weiß, dass der CSS-Block korrekt funktioniert, weil ich damit die Füllfarbe jedes Elements ändern kann.

* { 
    -fx-wrap-text: true; 
} 

Edit 2: Einige Leute sagten, auf anderen Halbbezogene Beiträge, die ein Bildlauffenster ein Knoten kann dazu führen, zu glauben, es eine viel größere Breite hat als das, was dem Benutzer angezeigt wird. Da eine JavaFX TreeTableView eine Bildlaufleiste verwendet, wenn die Tabelle zu groß ist, dachte ich mir, ich würde ihre Lösungen versuchen. Ich habe versucht, die bevorzugte Breite der Zelle einzustellen - immer noch keine Ergebnisse.

cell.setWrapText(true); 
cell.setPrefWidth(100); 
//cell.setMaxWidth(100); doing this too made no difference 
//cell.setMinWidth(100); doing this too made no difference 

Bearbeiten 3: Ich glaube, ich kenne das Problem! Es scheint, dass die Zeilenhöhe es ablehnt, die Zelle Text umzuleiten. Wenn ich die minimale Höhe der Zeilen auf einen ausreichend großen Wert setze, umschließt die Zelle ihren Text! Jetzt muss ich nur wissen, wie man die Zeilenhöhe dynamisch anpasst, um die Zelle anzupassen, wenn sie Text umbrechen will.

Bearbeiten 4: Es scheint, dass die Zeile keine Zeilenumbrüche erlaubt, die die Ursache dafür sein können, dass die Zelle den Text nicht umbrechen kann. Der Text kann nicht umgebrochen werden, da die neuen Zeilen chomped sind.

Antwort

1

Ich habe einen Ihrer Ansätze verwendet, aber auch benutzerdefinierte EditorBuilder, die JFXTextArea anstelle von JFXTextField hat.

Der Brauch TextAreaEditorBuilder ist folgende:

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 { 

} 
} 

und dann die Konfiguration für Ihre Spalte geht ungefähr so:

negativeCasingColumn.setCellFactory(param -> { 
     TextAreaEditorBuilder textAreaEditorBuilder = new TextAreaEditorBuilder(); 
     GenericEditableTreeTableCell<DiagnosticMethodFX, String> cell 
       = new GenericEditableTreeTableCell<>(textAreaEditorBuilder); 
     cell.setWrapText(true); 
     return cell; 
    }); 

Also im Grunde die Zelle Ich Einwickeln, aber ich dafür sorgen, Verwenden Sie TextArea als Bearbeitungsfeld.Bei mir funktioniert das ganz gut, aber wenn Sie elegantere Lösung wollen vielleicht können Sie überprüfen die CancelEdit() Methode in GenericEditableTreeTableCell, wo es die Inhaltsanzeige setzt nur auf Text: setContentDisplay (ContentDisplay.TEXT_ONLY) das ist Einstellung der Inhaltseigenschaft in der abstrakten Klasse Labeled, wobei der Textumbruch auf false gesetzt ist. Ich habe nicht zu tief hineingegrast, aber es gibt sicher einen Workaround.

+0

Ich ging stattdessen mit einer Java-Tree-Tabelle, aber ich plane, die JFXTreeTable in naher Zukunft eine weitere Aufnahme zu geben. Ich werde deinen Code dann versuchen, aber für den Moment sieht das wie eine solide Antwort aus, also werde ich es in der Zwischenzeit upvote! – Region39

+1

Großartig, danke! :) – smashbotica

+0

Also habe ich es endlich geschafft, deine Lösung heute zu implementieren, aber ich stecke auf einem Teil des Prozesses fest. Wenn Sie die Methode 'createNode' in' TreeAreaEditorBuilder' überschreiben, geben Sie 'ControlUtil.styleNodeWithPadding (Bereich)' zurück. Woher kommt 'ControlUtil'? Ich erhalte einen Fehler in IntelliJ und es werden keine Klassen zum Importieren vorgeschlagen. Ich konnte auch keine Dokumentation mit einer Google-Suche finden. – Region39

Verwandte Themen