import java.awt.BorderLayout; import java.awt.EventQueue; import java.awt.Frame; import java.awt.GridLayout; import java.awt.event.ActionEvent; import java.lang.reflect.InvocationTargetException; import javax.swing.AbstractAction; import javax.swing.JButton; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; import javax.swing.border.EmptyBorder; public class WindowController extends JFrame { // Create UI on correct thread public static void main( final String[] args ) { EventQueue.invokeLater( () -> new WindowController() ); } private JComboBox list; // Button class to call the right method private class ControlButton extends JButton { private ControlButton( final String name ) { super( new AbstractAction( name ) { public void actionPerformed( final ActionEvent e ) { try { WindowController.class.getMethod( "do" + name ) .invoke ( WindowController.this ); } catch ( final Exception x ) { // poor practice x.printStackTrace(); // also poor practice } } } ); } } // UI for controlling windows public WindowController() { super( "Controller" ); final JPanel main = new JPanel(); final JPanel controls = new JPanel(); setLocationByPlatform( true ); setResizable( false ); setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); setLayout( new BorderLayout( 3, 3 ) ); getRootPane().setBorder( new EmptyBorder( 3, 3, 3, 3 ) ); add( new JLabel( "Add windows and control them." ), BorderLayout.NORTH ); main.add( list = new JComboBox<>() ); add( main, BorderLayout.CENTER ); controls.setLayout( new GridLayout( 0, 1, 3, 3 ) ); controls.add( new ControlButton( "Add" ) ); controls.add( new ControlButton( "Hide" ) ); controls.add( new ControlButton( "Show" ) ); controls.add( new ControlButton( "Close" ) ); controls.add( new ControlButton( "Maximise" ) ); controls.add( new ControlButton( "Minimise" ) ); controls.add( new ControlButton( "Move" ) ); controls.add( new ControlButton( "Resize" ) ); add( controls, BorderLayout.EAST ); pack(); setVisible( true ); } // These are the windows we're controlling, but any JFrame would do private static class ControlledWindow extends JFrame { private int num; public ControlledWindow( final int num ) { super( Integer.toString( num ) ); this.num = num; setLocationByPlatform( true ); getRootPane().setBorder( new EmptyBorder( 3, 3, 3, 3 ) ); setDefaultCloseOperation( JFrame.DISPOSE_ON_CLOSE ); add( new JLabel( "I am window " + num + ". Use the controller to control me." ) ); pack(); setVisible( true ); } public String toString() { return "Window " + num; } } // Here comes the useful bit - window control code // Everything else was just to allow us to do this! public void doAdd() { list.addItem( new ControlledWindow( list.getItemCount () + 1 ) ); pack(); } public void doHide() { final JFrame window = getWindow(); if ( null == window ) { return; } window.setVisible( false ); } public void doShow() { final JFrame window = getWindow(); if ( null == window ) { return; } window.setVisible( true ); } public void doClose() { final JFrame window = getWindow(); if ( null == window ) { return; } window.dispose(); } public void doMinimise() { final JFrame window = getWindow(); if ( null == window ) { return; } window.setState( Frame.ICONIFIED ); } public void doMaximise() { final JFrame window = getWindow(); if ( null == window ) { return; } window.setExtendedState( Frame.MAXIMIZED_BOTH ); } public void doMove() { final JFrame window = getWindow(); if ( null == window ) { return; } final int hPos = getInt( "Horizontal position?" ); if ( -1 == hPos ) { return; } final int vPos = getInt( "Vertical position?" ); if ( -1 == vPos ) { return; } window.setLocation ( hPos, vPos ); } public void doResize() { final JFrame window = getWindow(); if ( null == window ) { return; } final int width = getInt( "Width?" ); if ( -1 == width ) { return; } final int height = getInt( "Height?" ); if ( -1 == height ) { return; } window.setBounds ( window.getX(), window.getY(), width, height ); } private JFrame getWindow() { final JFrame window = ( JFrame ) list.getSelectedItem(); if ( null == window ) { JOptionPane.showMessageDialog( this, "Add a window first" ); } return window; } private int getInt(final String prompt) { final String s = JOptionPane.showInputDialog( prompt ); if ( null == s ) { return -1; } try { return Integer.parseInt( s ); } catch ( final NumberFormatException x ) { JOptionPane.showMessageDialog( this, "Not a number" ); return -1; } } }