import java.util.List;
import java.util.Random;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import com.sun.javafx.scene.control.skin.ComboBoxListViewSkin;


import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.ListView;
import javafx.scene.layout.TilePane;
import javafx.stage.Stage;

public class ListViewHeightTest extends Application { 

	public static void main(String[] args) { 
		launch(args); 
	} 

	@Override 
	public void start(Stage primaryStage) throws Exception { 
		ObservableList <Integer> items = FXCollections.observableArrayList(); 
		LoaderService service = new LoaderService(); 

		Label pi = new Label("please wait...");	
		ComboBox <Integer> cb = new ComboBox <> (items); 
		cb.setPrefWidth(150); 
		cb.setPlaceholder(pi); 
		cb.setOnShown(ev -> { 
			ListView <?> lv = ((ComboBoxListViewSkin <?>) cb.getSkin()).getListView(); 
			lv.setMinHeight(70); 
			lv.autosize(); 
			System.out.println("onShown " + lv.getHeight()); 
			if (items.isEmpty()) service.restart(); 
		});	
		service.setOnSucceeded(ev -> { 
			items.setAll(service.getValue()); 
			ListView <?> lv = ((ComboBoxListViewSkin <?>) cb.getSkin()).getListView(); 
			lv.autosize(); 
			System.out.println("onSucceeded " + lv.getHeight()); 
		}); 

		Button reset = new Button("reset"); 
		reset.setOnAction(event -> items.clear()); 

		TilePane root = new TilePane(); 
		Scene scene = new Scene(root, 500, 300); 
		root.getChildren().addAll(cb, reset); 
		primaryStage.setScene(scene); 
		primaryStage.show(); 
	} 

	class LoaderService extends Service <List <Integer>> { 

		Random rd = new Random(); 

		@Override 
		protected Task <List <Integer>> createTask() { 
			return new Task <List <Integer>> () { 

				@Override 
				protected List <Integer> call() throws Exception { 
					Thread.sleep(1500); 
					return Stream.iterate(1, i -> i+1).limit(rd.nextInt(6) + 5).collect(Collectors.toList()); 
				} 
			}; 
		} 

	} 
} 

