192 lines
5.5 KiB
Java
192 lines
5.5 KiB
Java
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<ControlledWindow> 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;
|
|
}
|
|
}
|
|
}
|