Mega Code Archive

 
Categories / Java Tutorial / Swing
 

Show the given frame as modal to the specified owner

import java.awt.Frame; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; import javax.swing.JFrame; // @author Santhosh Kumar T - santhosh@in.fiorano.com  public class ModalFrameUtil {   static class EventPump implements InvocationHandler {     Frame frame;     public EventPump(Frame frame) {       this.frame = frame;     }     public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {       return frame.isShowing();     }     // when the reflection calls in this method has to be     // replaced once Sun provides a public API to pump events.     public void start() throws Exception {       Class<?> clazz = Class.forName("java.awt.Conditional");       Object conditional = Proxy.newProxyInstance(clazz.getClassLoader(), new Class[] { clazz },           this);       Method pumpMethod = Class.forName("java.awt.EventDispatchThread").getDeclaredMethod(           "pumpEvents", new Class[] { clazz });       pumpMethod.setAccessible(true);       pumpMethod.invoke(Thread.currentThread(), new Object[] { conditional });     }   }   // show the given frame as modal to the specified owner.   // NOTE: this method returns only after the modal frame is closed.   public static void showAsModal(final Frame frame, final Frame owner) {     frame.addWindowListener(new WindowAdapter() {       public void windowOpened(WindowEvent e) {         owner.setEnabled(false);       }       public void windowClosing(WindowEvent e) {         owner.setEnabled(true);         frame.removeWindowListener(this);       }       public void windowClosed(WindowEvent e) {         owner.setEnabled(true);         frame.removeWindowListener(this);       }     });     owner.addWindowListener(new WindowAdapter() {       public void windowActivated(WindowEvent e) {         if (frame.isShowing()) {           frame.setExtendedState(JFrame.NORMAL);           frame.toFront();         } else {           owner.removeWindowListener(this);         }       }     });     frame.setVisible(true);     try {       new EventPump(frame).start();     } catch (Throwable throwable) {       throw new RuntimeException(throwable);     }   } }