2012-04-01 17 views
7

Al activar WordWrap en ListView-Cell, el texto no se está ajustando. He aquí un ejemplo:JavaFX: setWrapText (true) (WordWrap) no funciona en 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, el texto de las celdas debe envolver pero todo el texto está en una línea se muestra una barra de desplazamiento horizontal.

¿Cómo puedo usar WordWrap en una celda de lista o se trata de un error de JavaFX?

+0

¿Ha intentado poner 'super.updateItem (item, empty);' first? – assylias

+0

El mismo efecto ... –

Respuesta

2

vea como un error en listcell, como solución alternativa puede utilizar ListView<Text> lugar:

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(); 

Si desea la lista de tamaño variable que puede utilizar de unión:

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

Buena idea, pero no funciona para mí. Necesito una envoltura dinámica. Si cambio el tamaño de la lista a un ancho = 100, el ajuste todavía está en el ancho 200. Creo que el [sesgo del contenido] (http://amyfowlersblog.wordpress.com/2011/06/02/javafx2-0-layout-a- clase-tour /) no funciona dentro de un ListView. –

+0

puede vincular widthWrap a un ancho de lista. He actualizado la respuesta con un ejemplo. –

+0

Se ve mejor, pero los últimos píxeles están ocultos por la barra de desplazamiento derecha y la barra de desplazamiento inferior todavía está allí. La barra de desplazamiento inferior tiene un comportamiento extraño. Subiré un video ... –

7

tenía exactamente el mismo problema. Aquí está el código que funcionó para mí.

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 fragmento de código, @Gleb, con un solo problema: 'text.textProperty(). Bind (itemProperty)()) 'no funcionó y tuve que simplemente usar' text.setText (item); ' – ajeh

Cuestiones relacionadas