2014-03-29 13 views
8

Ich habe ein Problem bei der Größenänderung eines TableView, das Textelemente enthält, die sich um TableCell-Elemente wickeln. Beim Ändern der Größe werden verborgene Werte in der Größe geändert, aber die sichtbaren Elemente berechnen den Textumbruch nicht neu.JavaFX-TableColumn-Textumbruch

The issue.

Die Tweets in der roten Box wurden während der Resize versteckt und hatten ihren Textumbruch wie erwartet eingestellt. Tweets oberhalb der Box waren während der Größenänderung sichtbar und haben immer noch die alte Verpackung.

Unten ist mein Code für die Größenänderungsphase.

fxSearchResultsTableTweet.setCellFactory(new Callback<TableColumn<Status, String>, TableCell<Status, String>>() { 
     @Override 
     public TableCell<Status, String> call(TableColumn<Status, String> arg0) { 
      return new TableCell<Status, String>() { 
       private Text text; 

       @Override 
       public void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty); 
        if (!isEmpty()) { 
         text = new Text(item.toString()); 
         text.setWrappingWidth(fxSearchResultsTableTweet.getWidth()); 
         this.setWrapText(true); 

         setGraphic(text); 
        } 
       } 
      }; 
     } 
    }); 
} 

Jede Hilfe würde sehr geschätzt werden.

+1

Versuchen Sie 'text.wrappingWidthProperty(). Bind (widthProperty());'. Die 'widthProperty' ist die Breite der Zelle. Ich habe das schnell ausgeheckt und die Breite verhält sich richtig, obwohl die Höhe nicht stimmt. –

+0

Das ist interessant, funktioniert auch für mich. Haben Sie eine Idee, wie Sie das Höhenproblem beheben können? – Steve

+0

Nein. Es verhält sich tatsächlich sehr schlecht in Bezug auf die Auswahl. Wenn Sie eine Standard-TableCell verwenden und den Text an die Elementeigenschaft der Zelle binden (ich poste den Code), erscheint es besser, aber immer noch nicht perfekt. –

Antwort

10

Dies ist näher, aber nicht groß:

textCol.setCellFactory(new Callback<TableColumn<Status, String>, TableCell<String, String>>() { 

     @Override 
     public TableCell<Status, String> call(
       TableColumn<Status, String> param) { 
      TableCell<Status, String> cell = new TableCell<>(); 
      Text text = new Text(); 
      cell.setGraphic(text); 
      cell.setPrefHeight(Control.USE_COMPUTED_SIZE); 
      text.wrappingWidthProperty().bind(cell.widthProperty()); 
      text.textProperty().bind(cell.itemProperty()); 
      return cell ; 
     } 

    }); 

In 2.2 zeigt die falsche Höhe, wenn Sie neue Objekte in die Tabelle, dann die Größe auf die Zellen richtig dimensioniert sind. In 8 ist es fast perfekt, scheint einfach zu versagen, nachdem der erste Gegenstand hinzugefügt wurde (zumindest in meinem Modell).

Wie in den Kommentaren erwähnt,

textCol.setCellFactory(tc -> { 
    TableCell<Status, String> cell = new TableCell<>(); 
    Text text = new Text(); 
    cell.setGraphic(text); 
    cell.setPrefHeight(Control.USE_COMPUTED_SIZE); 
    text.wrappingWidthProperty().bind(textCol.widthProperty()); 
    text.textProperty().bind(cell.itemProperty()); 
    return cell ; 
}); 

scheint besser zu funktionieren.

+10

Es funktioniert wie ein Charm, wenn Sie die Breite des Texts an die Spalten widthProperty und nicht an die Zelle cell.widthProperty binden. Ersetzen Sie einfach "text.wrappingWidthProperty(). Bind (cell.widthProperty());" mit "text.wrappingWidthProperty(). Bind (textCol.widthProperty());" –

+0

Wenn der Umbruch reagieren soll: 'text.wrappingWidthProperty(). Bind (textCol.widthProperty());' – Grigorious