Dialog有个setModal(boolean b),参数为true时,不关闭Dialog就无法操作frame。我现在由于一些特殊的原因,没办法使用Dialog,现在有两个frame窗体A和B,点击A的button时,打开B窗口,我想实现和Dialog相似的功能,B窗体不关闭时,不能操作A窗体,不知道该如何实现。哪位高人指点一下。

解决方案 »

  1.   

    其实JDialog能实现JFrame的大部分应用。你完全可以把JFrame里的东西移到JDialog中来用。
      

  2.   

    获取窗体句柄,用窗体的isActive()进行判断,当是A时,让B处于活动就可以了
      

  3.   


    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); 
        }