我的程序其实是ECLIPSE RCP(富客户端)程序, 在主程序之前有弹窗(Dialog)用来注册登录的,这些弹窗用的都是 Swt 和jface的窗口,而且是Dialog中有按钮,点了按钮又弹出其他Dialog(如果需要会关闭前面的Dialog),在这过程中如果用户X掉任何一个Dialog,我应该终止主程序。问题来了:1.SWT窗体没办法判断是不是还开着,Jface的连续的几个Dialog也没办法判断是不是还有没关的。以前都是用if(startwin.open() != Window.OK)

  log.info("Exit Application!"); //终止主程序
  return IApplication.EXIT_OK; 

//已登录,主程序继续
//以下是启动主程序的代码
.....
上面的startwin是个Jface的窗体,返回值很明确,而且最重要的它只有1个窗口,没有我那种A弹出B,B又弹出C的情况,A关没关很容易判断,但是它的子窗口怎么判断啊?用户在B中X掉了窗口以上的代码就没用了。哪位达人告诉我一下 SWT的窗体状态如何判断啊?Jface的Dialog嵌套如何判断它们至少有1个还开着啊?

解决方案 »

  1.   

    SHELL是有LISTENER的
    shell.addShellListener(new ShellListener(){});其中有shellClosed(ShellEvent e){}这个接口
    你可以把你所有DIALOG的SHELL注册给父SHELL然后给父SHELL添加这个监听
      

  2.   

    可以调用 PlatformUI.getWorkbench().close() 直接退出主程序
    if(startwin.open() != Window.OK)

      log.info("Exit Application!"); //终止主程序
      PlatformUI.getWorkbench().close(); 

      

  3.   


    不明白你说的“把你所有DIALOG的SHELL注册给父SHELL”是怎么个注册法?添加监听我倒是会的
      

  4.   

    就是在你父SHELL的类里能得到你所有DIALOG的SHELL就可以,然后在SHELLLISENER里对E.GETSOURCE()进行不同的监听和处理
      

  5.   


    这些dialog在走到下一个diglog时候 上1个已经关闭了,比如父A关闭时打开子B,子B关闭时候才有C那么父A都已经关闭了(其实我就是想让它不要显示在屏幕上就行),还能用你说的listener方法吗?
      

  6.   

    关闭的时候你要new下一个shell吧,把被关闭的shell当做构造器的参数传过去就好了,不过这样太麻烦了,你可以写一个类专门做这些事情,控制打开关闭,而监听器在这个类里调用
      

  7.   

    我照你说的把同一个SHELL向下传递,监听父shell ,好像不好使啊。你有MSN 吗,交流一下啊
      

  8.   

    你加你了,你是不是不用MSN啊 ,也没见你上,你用别的比如QQ也可以告诉我啊,发个消息给我号码就行