import java.awt.EventQueue; import java.awt.FlowLayout; import javax.swing.*; public class UnninstallUIMemoryLeaks { private static JFrame frame; public static void main(String[] argv) throws Exception { EventQueue.invokeAndWait(() -> { frame = new JFrame(); frame.setLayout(new FlowLayout()); frame.setSize(300, 300); frame.setLocationRelativeTo(null); frame.add(new JButton("button")); frame.add(new JCheckBox("checkbox")); frame.add(new JEditorPane()); frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE); JMenuBar bar = new JMenuBar(); JMenu menu1 = new JMenu("menu1"); JMenu menu2 = new JMenu("menu2"); menu1.add(new JMenuItem("menuitem")); menu2.add(new JCheckBoxMenuItem("JCheckBoxMenuItem")); bar.add(menu1); bar.add(menu2); frame.add(new JLabel("label")); frame.add(new JFormattedTextField("JFormattedTextField")); frame.add(new JProgressBar()); frame.add(new JRadioButton("JRadioButton")); frame.add(new JCheckBox("JCheckBox")); String[] data = {"one", "two", "three", "four"}; JList list = new JList(data); frame.add(list); frame.add(new JPanel()); frame.add(new JSlider()); frame.add(new JSpinner()); JDesktopPane pane = new JDesktopPane(); JInternalFrame internalFrame = new JInternalFrame(); internalFrame.setBounds(10, 10, 130, 130); internalFrame.setVisible(true); pane.add(internalFrame); pane.setSize(150, 150); frame.add(pane); frame.setJMenuBar(bar); frame.setVisible(false); frame.pack(); frame.setSize(300, 300); }); EventQueue.invokeAndWait(() -> { for (int i = 0; i < 8000; ++i) { System.out.println("i = " + i); SwingUtilities.updateComponentTreeUI(frame); } }); EventQueue.invokeAndWait(() -> { if (frame != null) { frame.dispose(); } }); } }