[rcp系列]指定JFace.Dialog初始化的位置

目的1: 打开一个新的 对话框 时,如何设定它和父 对话框 的相对位置?比如在登录 对话框 有一个“创建新帐号”的按钮,用户点击以后,就出现新的对话框用于注册,请问如何能让新的 对话框 和旧 对话框 排列的整齐一些?应该是能设定二者的相对位置吧?

最开始,以为要用 Shell.setLocation来设置,但是对于一个Dialog而言,它的Shell在什么时候才能初始化呢?

我 在构造函数里面,configureShell(Shell newShell)方法里面,Control createDialogArea(Composite parent)方法里面都调用过了this.getShell方法想得到当前的Shell,结果都抛出空指针异常....

后来看书发现,应该重写protected Point getInitialLocation(Point initialSize)方法

比如,在最开始的例子中,在第二个对话框中我重写了该方法,代码如下:

protected  Point getInitialLocation(Point initialSize) {
        Point location 
=   new  Point( this .getParentShell().getLocation().x
                
+   this .getParentShell().getBounds().width,  this
                .getParentShell().getLocation().y
                
+   this .getParentShell().getBounds().height
                
-   this .getInitialSize().y);
        
return  location;
    }


其结果就是两个对话框底部对齐的平行排列:)

目的2: 登陆对话框要记住上次的位置。

想了半天,好像只能用IPreferenceStore来做了,在继承了AbstractUIPlugin的类中放入两个常量:

     public   static   final  String LOGINDIALOG_POSITION_X  =   " LOGINDIALOG_POSITION_X " ;

    
public   static   final  String LOGINDIALOG_POSITION_Y  =   " LOGINDIALOG_POSITION_Y " ;

然后重写两个方法:

    @Override
    
protected  Point getInitialLocation(Point initialSize) {

        String xposition 
=  preferenceStore
                .getString(Peer68TPlugin.LOGINDIALOG_POSITION_X);
        String yposition 
=  preferenceStore
                .getString(Peer68TPlugin.LOGINDIALOG_POSITION_Y);
        
if  (xposition  ==   null   ||  yposition  ==   null || xposition == ""
                || yposition == ""
) {
            
return   super .getInitialLocation(initialSize);
        } 
else  {
            
return   new  Point(Integer.parseInt(xposition), Integer
                    .parseInt(yposition));
        }
    }

    @Override
    
public   boolean  close() {
        preferenceStore.setValue(Peer68TPlugin.LOGINDIALOG_POSITION_X, 
this
                .getShell().getLocation().x);
        preferenceStore.setValue(Peer68TPlugin.LOGINDIALOG_POSITION_Y, 
this
                .getShell().getLocation().y);
        
return   super .close();
    }

大功告成!

你可能感兴趣的:([rcp系列]指定JFace.Dialog初始化的位置)