import java.util.Vector; 
import javafx.application.Application; 
import javafx.application.Platform; 
import javafx.geometry.Side; 
import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.control.MenuButton; 
import javafx.scene.layout.HBox; 


public class CustomMenuLeakTest extends Application { 

	public static MenuButton m_Menu = new MenuButton("Menu"); 

	@Override 
	public void start(Stage primaryStage) { 
		try { 
			HBox root = new HBox(); 
			Scene scene = new Scene(root,400,400); 
			m_Menu.setPopupSide(Side.BOTTOM); 
			root.getChildren().addAll(m_Menu); 
			primaryStage.setScene(scene); 
			primaryStage.show(); 

			//create thread to simulate dynamic adding and 
			//removing from the menu 
			Thread t = new Thread(() -> { 
				dynamicMenuThread(); 
			}); 
			t.start(); 
		} catch(Exception e) { 
			e.printStackTrace(); 
		} 
	} 

	public void dynamicMenuThread() { 
		Vector<TestMenuItem> list = new Vector<TestMenuItem>(); 
		while(true) { 
			//create items 
			Platform.runLater(() -> { 
				for(int i = 1; i < 6; ++i) { //make menu items 
					TestMenuItem item = new TestMenuItem(m_Menu.getItems()); 
					item.addToMenu(i); 
					item.setItem("Item"+i, i); 
					list.add(item); 
				} 
				for(int i = 6; i < 11; ++i) { //make menu items with sub items 
					TestMenuItem item = new TestMenuItem(m_Menu.getItems()); 
					item.addToMenu(i); 
					item.setItem("Item"+i, i); 
					TestMenuItem subItem = item.addSubItem(); 
					subItem.setItem("subItem1", 1); 
					subItem.addToMenu(0); 
					list.add(subItem); 
					subItem = item.addSubItem(); 
					subItem.setItem("subItem2", 2); 
					subItem.addToMenu(1); 
					list.add(subItem); 
					list.add(item); 
				} 
			} 
					); 
			try { 
				Thread.sleep(1000); 
			} catch (InterruptedException e) { 
				e.printStackTrace(); 
			} 
			//remove items 
			while(true) { 
				if(list.isEmpty()) { 
					break; 
				} 
				Platform.runLater(() -> { 
					//remove some items 
					list.remove(0).removeFromMenu();	
				}); 
				try { 
					Thread.sleep(500); 
				} catch (InterruptedException e) { 
					e.printStackTrace(); 
				} 
			} 
		} 
	} 

	public static void main(String[] args) { 
		launch(args); 
	} 
} 
