2012-04-01 12 views
7

Quando si attiva WordWrap in ListView-Cell, il testo non viene spostato. Ecco un esempio:JavaFX: setWrapText (true) (WordWrap) non funziona in ListView

public class ListBug extends Application { 

public static void main(String[] args) { 
    launch(args); 
} 

@Override 
public void start(Stage primaryStage) { 
    ListView<String> myList = new ListView<String>(); 

    myList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { 

     @Override 
     public ListCell<String> call(ListView<String> param) { 
      return new ListCell<String>() { 
       @Override 
       public void updateItem(String item, boolean empty) { 
        setWrapText(true); 
        setText(item); 
        super.updateItem(item, empty); 
       } 
      }; 
     } 
    }); 

    for (int i = 0; i < 100; i++) { 
     myList.getItems() 
       .add("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
         + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
         + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
         + "nisi ut aliquip ex ea commodo consequat."); 
    } 
    primaryStage.setScene(new Scene(myList)); 
    primaryStage.setTitle("ListWrapBug"); 
    primaryStage.show(); 
} 

}

Normalmente il testo nelle celle dovrebbero avvolgere ma tutto il testo è in una linea di una barra di scorrimento orizzontale è mostrato.

Come posso utilizzare WordWrap in una cella di elenco o si tratta di un bug JavaFX ??

+0

Hai provato a mettere 'super.updateItem (elemento, vuoto);' prima? – assylias

+0

Lo stesso effetto ... –

risposta

2

apparire come un bug in ListCell, come soluzione alternativa è possibile utilizzare ListView<Text> invece:

ListView<Text> myList = new ListView<Text>(); 

    for (int i = 0; i < 100; i++) { 
     myList.getItems().add(TextBuilder.create().text("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
       + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
       + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
       + "nisi ut aliquip ex ea commodo consequat.").wrappingWidth(200).build()); 
    } 

    myList.setPrefWidth(200); 
    primaryStage.setScene(new Scene(myList)); 
    primaryStage.setTitle("ListWrapBug"); 
    primaryStage.show(); 

Se volete lista ridimensionabile è possibile utilizzare vincolante:

ListView<Text> myList = new ListView<Text>(); 

    for (int i = 0; i < 100; i++) { 
     Text text = new Text("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
       + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
       + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
       + "nisi ut aliquip ex ea commodo consequat."); 
     text.wrappingWidthProperty().bind(myList.widthProperty()); 
     myList.getItems().add(text); 
    } 
+0

Buona idea ma non funziona per me. Ho bisogno di un avvolgimento dinamico. Se ridimensiono l'elenco a width = 100 il Wrap è ancora a larghezza 200. Penso che il [pregiudizio del contenuto] (http://amyfowlersblog.wordpress.com/2011/06/02/javafx2-0-layout-a- class-tour /) non funziona all'interno di un ListView. –

+0

è possibile associare la larghezza a una larghezza dell'elenco. Ho aggiornato la risposta con un esempio. –

+0

Sembra migliore ma gli ultimi pixel sono nascosti dalla barra di scorrimento a destra e la barra di scorrimento in basso è ancora lì. La barra di scorrimento in basso ha uno strano comportamento. Caricherò un video ... –

7

avuto esattamente lo stesso problema. Ecco il codice che ha funzionato per me.

public class ListBug extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage primaryStage) { 
     ListView<String> myList = new ListView<String>(); 
     myList.setCellFactory(new Callback<ListView<String>, ListCell<String>>() { 
      @Override 
      public ListCell<String> call(final ListView<String> list) { 
       return new ListCell<String>() { 
        { 
         Text text = new Text(); 
         text.wrappingWidthProperty().bind(list.widthProperty().subtract(15)); 
         text.textProperty().bind(itemProperty()); 

         setPrefWidth(0); 
         setGraphic(text); 
        } 
       }; 
      } 
     }); 

     for (int i = 0; i < 100; i++) { 
      myList.getItems() 
        .add("Lorem ipsum dolor sit amet, consectetur adipisicing elit, " 
          + "sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. " 
          + "Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris " 
          + "nisi ut aliquip ex ea commodo consequat."); 
     } 
     primaryStage.setScene(new Scene(myList)); 
     primaryStage.setTitle("ListWrapBug"); 
     primaryStage.show(); 
    } 
} 
+0

Gran parte del codice, @Gleb, con un solo problema: 'text.textProperty(). Bind (itemProperty()) 'non ha funzionato e ho dovuto usare semplicemente' text.setText (item); ' – ajeh

Problemi correlati