PreferenceDialog继承于Jface包中的Dialog类
WizardDialog也继承于Jface包中的Dialog类
这两个Dialog看似很难自定义其初始位置,因为这Dialog.open()前,Shell还为null,open()以后,对Shell进行定位不仅毫无效果还会导致系统崩溃,因为open()函数会阻塞线程,open()之后的语句要等到Shell.dispose()掉后才可以执行,在open()之后执行之前Shell的相关操作不崩溃才怪,所以之前大家通常使用的Shell.setLocation(x,y)函数就没有用了。
那怎么定义这些对话框的位置呢,查看jface.dialogs.Dialog类可以发现,他给出了protected类型的两个函数:
protected Point getInitialSize()
和
protected Point getInitialLocation(Point initialSize)
这两个函数在Dialog.open()时被super.open()函数调用,根据函数的返回值制定Dialog的初始位置,所以机会来了。重写这两个类,让他们返回我们想要的初始大小和初始位置。从这点可以看出,jface包中的类确实做了很多优化,大部分功能都可以被重写,swt中get,set风格在jface中又有了新的表现方式(比如jface的Dialog类中不必重写open()函数,重写protected Control createContents(Composite parent)函数即可以实现Dialog的布局内容),这应该是大家在编码过程中需要留意的。