java 板


※ 引述《[email protected] (痞子軍團團長)》之銘言: > ※ 引述《neigence (心夜)》之銘言: > : 假如我有一個程式 > : public class myFrame extends JFrame{ > : public AAA(){ > : Container con=getContentPane(); > : con.add(myPanelA); > : con.add(myPanelB); > : con.add(myPanelC); > : ..... > : } > : } > : 每一個panel都也許具有許多的gui元件 像JButton JTextfield > : 每一個panel都在不同的class > : 比方說 我按下myPanelB上的某個button 會影響讓myPanelA畫出 > : 什麼東西 或發生某些行為 或更動變數狀態 > : 那..理論上? 這幾個myPanel下所有gui元件的ActionListener > : 都要寫在myFrame這個程式下面嚕?..這樣子光這個檔下面的 > : actionPerformed 真的會太多了 ++myFrame+++++++++++++++++ | | | A panel Button | | | +------------------------- | | | B panel Text | | | +------------------------- | | | C panel Label | | | +------------------------- 你可能在B text填了什麼, 按了A的Button之後,想透過C的Label顯示點什麼訊息 所以直覺想幫A加了一個ActionListener { 取得ORZ = B.text 經過謎樣的邏輯運算後 XD = cal(ORZ) 顯示結果在C之中 C.label = XD } 這只是一種初步的想法,當你的Component很多的時候 就會難以控制。因為任何的Component都可能產生關係 要站在某一方(ex. A's Listener)的觀點去操控其他所有的元件 會增加程式設計師的負擔。 for example: ActionListener { t1 = A.xd; B.label = func1(t1) C.label = func2(t1) D.label = func3(t1) t2 = sum({B, C, D}.label) ............ ........ .... . } 這樣一來計算過還可能有些用處的資料,都散落在各個元件之中。 還要一一再收回? 可能會瘋掉。 =========================================================== Tip 1 :: GUI的資料要獨立且唯一 為了解決資料散落於各元件的問題,我們應該建立新的Class來表現 我們所用來展示、算計、暫存用的資料,有續存的需求更可以實作 Serializable。 所以,先讓資料獨立出來。 public class CheckableData { private String foo; public void setData(String f){foo=f;} } Tip 2 :: 不要讓運算邏輯散落於Listener之中 讓Data的歸Data的,使用者介面的歸使用者介面的 假設我們要讓資料可序列化,你不可以把序列化的主要部分寫在 Action之中。應該擺在CheckableData這裡才對 (ex. save method) ========================================================== 以提供base64 encode為例: import sun.misc.BASE64Encoder; public class CheckableData { private String foo; public void setData(String f) { foo = f; } public String getEncodeAsBase64() { return new BASE64Encoder().encode(foo.getBytes()); } } (bad style) encode_button.addActionListener(){ ......................... xd.label = new BASE64Encoder().encode(foo.getBytes()); } 這樣做的好處是,邏輯運算的部分幾乎都可以回歸資料本身。 達到純粹send message來溝通。 ======================================================== 即使經過了Tip 1、Tip 2資料獨立了,邏輯計算都歸位了。 你可能還是望著內容不少的Listener而懊惱。 這是怎麼一回事呢? 我們還需要改變些什麼!? 回過頭來看一下Listener { 取得ORZ = B.text 經過謎樣的邏輯運算後 XD = cal(ORZ) 顯示結果在C之中 C.label = XD } 這是在按了某個東西,觸發了事件。 最後導致了C.label更新 許多入門的書可能都是這樣寫了 按了foo,計算一下,直接更新了bar 這是個很直覺的構想,也不用覺得寫書的人有什麼不錯 因為他的重點在介面GUI,而我們今天的重點在 怎麼讓自己程式寫起來負擔小一點, 不會把code都擠在一起。 所以,為了我們的睡眠品質與減輕壓力應該想一想 是否有較好的方式,懶人思維: 是不是能讓C.label 自己更新自己 (general case: 讓(..)自己更新自己) 如果成真了這樣一來,就能讓Listener中更新 其他元件的code消失,而Listener只要通知Data object 去計算資料即可 ===================================================== Tip 3 :: 讓需要取得資料者成為觀察者 (提供資料的為被觀察者) j2se提供了這樣的機制 Interface Observer void update(Observable o, Object arg) Class Observable addObserver(Observer o) notifyObservers() setChanged() 這要怎麼用呢!? Observer --> 需要取用資料者 Observable --> 持有/產生資料者 以我們的例子,CheckableData是產生資料者: import java.util.Observable; import sun.misc.BASE64Encoder; public class CheckableData extends Observable { private String foo; public void setData(String f) { foo = f; this.setChanged(); // 標示,我"變"了 this.notifyObservers(); // 昭告天下,我真的"變了" } public String getEncodeAsBase64() { return new BASE64Encoder().encode(foo.getBytes()); } } ====================================================== import java.util.Observable; import java.util.Observer; import javax.swing.JLabel; public class ObLabel extends JLabel implements Observer { private String label; public ObLabel(Observable o , String s) { o.addObserver(this); label = s; } public void setLabel(String s) { this.label = s; this.setText(s); } public void update(Observable o, Object arg) { if (o instanceof CheckableData) { CheckableData cd = (CheckableData) o; // 取得資料 setLabel(cd.getEncodeAsBase64()); // 自己更新自己 } } } 如此一來,則所有元件可以透過觀察CheckableData來自動更新。 Listener所負擔的code也就少了,複雜的元件關係也獲得了解脫。 -- 偷偷講,其實這是簡單的講怎麼做mvc @"@ mvc 是策略模式+觀察著模式與一些互動的規範而成。 此篇稍略了策略模式,但大致上還算可用 -- ※ Origin: SayYA 資訊站 <bbs.sayya.org> ◆ From: pc210-59-94-161.nutn.edu.tw







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草
伺服器連線錯誤,造成您的不便還請多多包涵!
「贊助商連結」






like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:Gossiping站內搜尋

TOP