2011-07-16 48 views
2

我有一个JFace应用程序和一个文件列表。当用户点击列表中的文件时,将打开一个子窗口。子窗口自动将文件内容加载到文本窗口小部件中。关闭初始化JFace窗口

加载文件内容可能会失败。我可以检测到这种情况,我很乐意在屏幕上显示之前关闭子窗口。

我试着在子窗口的覆盖protected Control createContents(Composite parent)方法结束时调用close()。但我得到了在图书馆的JFace某处空例外:

Exception occurred java.lang.NullPointerException 
at org.eclipse.jface.window.Window.initializeBounds(Window.java:758) 
at org.eclipse.jface.window.Window.create(Window.java:435) 
at org.eclipse.jface.window.Window.open(Window.java:790) 

哪里是初始化与初始值的窗口小部件正确的地方吗?理想情况下,我觉得它应该符合以下条件:

  • 小工具应该已经由框架创建。
  • 该窗口应该不可见。
  • close()如果需要应该正确关闭窗口。

回答

0

如果Window对象还没有得到又一个窗口的外壳,open()方法创建一个新的,打开它。当调用createContents(Composite parent)时,它的create()方法以及一些配置一些视觉细节的其他方法。这是initializeBounds()方法,它依赖于一个已经存在的shell。如果你关闭它,那么你去了,你有例外。

也许你会想覆盖open()方法本身:

public int open() { 
    if (!condition) 
     return super.open(); // as usual 
    else 
     return CANCEL; 
} 
+0

感谢您的想法。我现在无法检查。但是,似乎我必须在'if'之前放置初始化代码。因此,初始化代码将无法访问小部件,因为小部件是在'super.open()'执行时创建的。看来,我必须将初始化代码分成两部分:1)不依赖于小部件,可能会失败; 2)对小部件的依赖,绝不能失败。 – borisstr