JavaFX: setWrapText (true) (WordWrap) does not work in ListView

When WordWrap is activated in ListView-Cell, the text does not wrap. Here is an example:

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

}

Normally, the text in the cells should be completed, but all the text is on the same line and a horizontal scrollbar is displayed.

How can I use WordWrap in a list cell or is it a JavaFX error?

+7
source share
2 answers

There was the same problem. Here is the code that worked for 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(); } } 
+7
source

Looks like an error in ListCell, as a workaround, you can use ListView<Text> instead:

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

If you want to resize the list, you can use the binding:

  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); } 
+2
source

All Articles