如题 
子界面closed事件出发后 父界面如何知道?

解决方案 »

  1.   


    子界面如果是用 JDialog有两种情况,第一种如果dialog是模态: 
    dialog.setModal(true);
    dialog.setVisible(true);
    // ...
    当运行到 dialog.setVisible(true); 的时候,当前线程会被挂起,直到dialog被关闭之后才会返回,继续执行下面的代码。另外所有的 Window 的子类都可以 addWindowListener(),而WindowListener中有一个方法是void windowClosed(WindowEvent e) 通过这个就可以知道dialog关闭
      

  2.   


    addWindowListener()是在子页面中可以监听到JDialog是否可以关闭 
    但是我子页面关闭后 想让父页面直接捕获到  可以么?
    除了数据库和文件操作之外   父页面(panel)可以捕获到子页面(JDialog)是否关闭?
      

  3.   


    addWindowListener()WindowListener 可以写在任何地方,任何一个类只要 implements WindowListener 就可以加进去,你要在子对话框关闭的时候在父窗体运行任何逻辑,只要在父窗体的类中定义一个内部类,implements WindowListener,然后把它加进子对话框就行了:
      
      dialog.addWindowListener(new WindowAdapter() {
        
        @Override
        public void windowClosed(WindowEvent e) {
        
          // 这里调用你想要运行的逻辑
        }
      });
      

  4.   


    再请教一个问题 
    为什么我子窗口每次关闭 
    public void windowClosed(WindowEvent e) {} 都会执行3次?
    有什么办法能让它只执行一次?
      

  5.   

    试试  void windowClosing(WindowEvent e)
    import java.awt.event.WindowEvent;
    import java.awt.event.WindowListener;
    import javax.swing.JDialog;
    import javax.swing.SwingUtilities;
    /**
     *
     * @date   13/11/2012
     */
    public class TestWindowListener implements WindowListener{
      
      public static void main(String[] args) {
        
        SwingUtilities.invokeLater(new Runnable() {      @Override
          public void run() {
            
            JDialog d = new JDialog();
            d.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            d.setSize(800, 500);
            d.setLocationRelativeTo(null);
            d.addWindowListener(new TestWindowListener());
            d.setVisible(true);
          }
        });
      }  @Override
      public void windowOpened(WindowEvent e) {
        
        System.out.println("windowOpened " + e);
      }  @Override
      public void windowClosing(WindowEvent e) {
        
        System.out.println("windowClosing " + e);
      }  @Override
      public void windowClosed(WindowEvent e) {
        
        System.out.println("windowClosed " + e);
      }  @Override
      public void windowIconified(WindowEvent e) {
        
        System.out.println("windowIconified " + e);
      }  @Override
      public void windowDeiconified(WindowEvent e) {
        
        System.out.println("windowDeiconified " + e);
      }  @Override
      public void windowActivated(WindowEvent e) {
        
        System.out.println("windowActivated " + e);
      }  @Override
      public void windowDeactivated(WindowEvent e) {
        
        System.out.println("windowDeactivated " + e);
      }
    }---run:
    windowActivated java.awt.event.WindowEvent[WINDOW_ACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
    windowOpened java.awt.event.WindowEvent[WINDOW_OPENED,opposite=null,oldState=0,newState=0] on dialog0
    windowClosing java.awt.event.WindowEvent[WINDOW_CLOSING,opposite=null,oldState=0,newState=0] on dialog0
    windowDeactivated java.awt.event.WindowEvent[WINDOW_DEACTIVATED,opposite=null,oldState=0,newState=0] on dialog0
    windowClosed java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on dialog0
    windowClosed java.awt.event.WindowEvent[WINDOW_CLOSED,opposite=null,oldState=0,newState=0] on dialog0
    BUILD SUCCESSFUL (total time: 3 seconds)