Posted on 2006-11-08 15:23
小小涼粉 閱讀(2207)
評(píng)論(0) 編輯 收藏
目的1:
打開(kāi)一個(gè)新的對(duì)話框時(shí),如何設(shè)定它和父對(duì)話框的相對(duì)位置?比如在登錄對(duì)話框有一個(gè)“創(chuàng)建新帳號(hào)”的按鈕,用戶點(diǎn)擊以后,就出現(xiàn)新的對(duì)話框用于注冊(cè),請(qǐng)問(wèn)如何能讓新的對(duì)話框和舊對(duì)話框排列的整齊一些?應(yīng)該是能設(shè)定二者的相對(duì)位置吧?最開(kāi)始,以為要用
Shell.setLocation來(lái)設(shè)置,但是對(duì)于一個(gè)Dialog而言,它的Shell在什么時(shí)候才能初始化呢?
我
在構(gòu)造函數(shù)里面,configureShell(Shell newShell)方法里面,Control
createDialogArea(Composite
parent)方法里面都調(diào)用過(guò)了this.getShell方法想得到當(dāng)前的Shell,結(jié)果都拋出空指針異常....
后來(lái)看書(shū)發(fā)現(xiàn),應(yīng)該重寫(xiě)protected Point getInitialLocation(Point initialSize)方法
比如,在最開(kāi)始的例子中,在第二個(gè)對(duì)話框中我重寫(xiě)了該方法,代碼如下:
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;
????}
其結(jié)果就是兩個(gè)對(duì)話框底部對(duì)齊的平行排列:)
目的2: 登陸對(duì)話框要記住上次的位置。
想了半天,好像只能用IPreferenceStore來(lái)做了,在繼承了AbstractUIPlugin的類(lèi)中放入兩個(gè)常量:
????public?static?final?String?LOGINDIALOG_POSITION_X?=?"LOGINDIALOG_POSITION_X";
????public?static?final?String?LOGINDIALOG_POSITION_Y?=?"LOGINDIALOG_POSITION_Y";
然后重寫(xiě)兩個(gè)方法:
????@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();
????}
大功告成!