近日用 Swing 开发的时候遇到一个问题,特向各位请教。现在有一个 JFrame frame 和一个 JDialog dialog,其中 dialog 是子窗口,frame 是父窗口,dialog 是调用 JDialog(Frame owner, boolean modal) 这个构造函数创建的,并且 modal == true,也就是说必须先关闭 dialog 才能对 frame 进行操作。我的问题是当关闭 dialog 的时候(用 dispose() 关闭),frame 怎样才能监听到这一事件,并对 frame 内部的组件进行更新?我看了一下 JFrame 可以监听的事件,但是似乎都不是所需要的。如果 frame 确实无法监听这类事件,那么如果 dialog 中某个方法得到了 frame 中组件所需的数据,例如 frame 中有一个 JTable table,其数据必须从 dialog 中获得,怎样才能使 table 获得这些数据,并进行更新呢?还望各位大侠多多指教,谢谢!

解决方案 »

  1.   

    补充: 我试过在 frame 中做一个 table 的 getter,然后在 dialog 关闭时用 dialog 中的方法更新 table,但是我不确定这样做是否线程安全,因为我觉得子窗口和父窗口用的不是一个事件派发线程,这样理解不知道是否有误。而且用 getter 获得父窗口的组件并在子窗口中更新似乎不是很好的方法。不知大家是怎么解决的?
      

  2.   

    做一个事件中间件
    关闭的时候,向中间件 EventCenter 发一个 事件。
    然后在 frame 显示的时候,用内部类 注册一个事件。
      

  3.   

    用windowlistener  sys.exit()
      

  4.   

    7楼朋友,用 System.exit() 不就退出了吗?能说得具体一点吗?
    我现在的做法是,在 frame 中定义一个变量,用来表示是否关闭了子窗口。dialog 在关闭时设置该变量为 true。然后在 frame 中监听 windowActivated 事件,当 frame 被激活时,检查这个变量是否是 true。如果是 true,再进行组件更新。虽然可行,但总觉得这样做不专业,因为 windowActivated 事件会经常发生,比如最小化然后还原,或者 frame 重新获得焦点时。
    很感谢各位的回答,不过如果谁能给一个简单的例子,就容易理解多了。
      

  5.   


    JFrame main_jf= new JFrame();
    main_jf.addWindowListener(new WindowAdapter(){
    @Override
    public void windowClosing(WindowEvent arg0){
     //自己写代码
    }

    });
      

  6.   

    不是在关闭 frame 的时候监听事件,而是在关闭 frame 的子窗口 dialog 时,父窗口 frame 能监听到这一事件。
    我暂时用上面那个变量的方法解决。结贴了。