聲明:本文章中介紹的内容可以在GPF項目中找到相應的實作。
MDI的子視窗間的資料共享是在設計MDI程式是應當注意的問題。作為MDI程式的GPF,在設計時也需要考慮這一點。
GPF中,對于一些繪圖工具的設定,可以設定成全局性的。也就是說,當視窗1點選“繪制直線”按鈕時,視窗2目前的操作同樣更改為“繪制直線”。這時,就有兩種方法實作,一個是“送出去”,一個是“取過來”。
所謂“送出去”,是指的由主程式将更改的資料送發給各個子視窗。比如如下的代碼:
//...
currentColor = newColor;
JInternalFrame[] frames = jDesktopPane.getAllFrames();
for(JInternalFrame iframe : frames){
iframe.setColor(currentColor);
}
//...
這段代碼很清楚,當屬性currentColor改變時,首先擷取目前JDesktopPane中所有的JInternalFrame,然後利用循環依次設定。這個可以稱作“送出去”,是有主程式發送給内部子視窗各個資料的。
另外一個是“取過來”,意思是由子視窗去擷取最新資料。當子視窗被選擇時,它才需要擷取最新資料,進而執行相應的操作。是以,根據這一思路,我們将子視窗的isSelected方法進行重寫:
// in child class of JInternalFrame
class InnerFrame extends JInternalFrame {
//...
Color innerColor;
@Override
public boolean isSelected(){
if(isSelected) {
innerColor = currentColor;
}
return isSelected;
}
}
這裡,我們重寫了JInternalFrame的isSelected方法,根據繼承來的isSelected屬性進行設定,當isSelected為true時,更新自身的屬性,這就實作了主動“取過來”獲得資料的方法。
當然,這并不一定是最好的方法,但是個人覺得還是簡單可行的。在早版本的GPF中使用的是第一種“送出去”的方法,結果存在大量的循環代碼,而在新版本中,則使用了“取過來”方法,比起前一版本更加簡單可行。
本文轉自 FinderCheng 51CTO部落格,原文連結:
http://blog.51cto.com/devbean/92925