// 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 windowClosed(WindowEvent e){ owner.setEnabled(true); owner.removeWindowListener(this); } });
// @author Santhosh Kumar T - [email protected] public class ModalFrameTest{ public static void main(String[] args){ try{ UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName()); } catch(Exception e){ e.printStackTrace(); }
final JFrame mainFrame = new JFrame("Are you missing maximize button in JDialog ?? - [email protected]"); mainFrame.getContentPane().add(new JScrollPane(new JTextArea("this is simle text area. \nyou won't be able to edit me while modal frame is visible..."))); mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); mainFrame.setSize(400, 300);
Action action = new AbstractAction("Show Modal Frame..."){ public void actionPerformed(ActionEvent e){ JFrame frame = new JFrame(); frame.getContentPane().add(new JScrollPane(new JTree())); frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); frame.setSize(300, 400); ModalFrameUtil.showAsModal(frame, mainFrame); // this statement will be executed only after the modal frame is closed JOptionPane.showMessageDialog(mainFrame, "modal frame closed."); } };
http://www.jroller.com/resources/s/santhosh/ModalFrame.jnlp
// 原理就是监听FouceLost
// code import javax.swing.*;
import java.awt.*;
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;
// @author Santhosh Kumar T - [email protected]
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() ? Boolean.TRUE : Boolean.FALSE;
}
// 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 windowClosed(WindowEvent e){
owner.setEnabled(true);
owner.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);
}
}
}// code 2 import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
// @author Santhosh Kumar T - [email protected]
public class ModalFrameTest{
public static void main(String[] args){
try{
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch(Exception e){
e.printStackTrace();
}
final JFrame mainFrame = new JFrame("Are you missing maximize button in JDialog ?? - [email protected]");
mainFrame.getContentPane().add(new JScrollPane(new JTextArea("this is simle text area. \nyou won't be able to edit me while modal frame is visible...")));
mainFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
mainFrame.setSize(400, 300);
Action action = new AbstractAction("Show Modal Frame..."){
public void actionPerformed(ActionEvent e){
JFrame frame = new JFrame();
frame.getContentPane().add(new JScrollPane(new JTree()));
frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
frame.setSize(300, 400);
ModalFrameUtil.showAsModal(frame, mainFrame);
// this statement will be executed only after the modal frame is closed
JOptionPane.showMessageDialog(mainFrame, "modal frame closed.");
}
};
mainFrame.getContentPane().add(new JButton(action), BorderLayout.SOUTH);
mainFrame.setVisible(true);
}
}