經驗分享:開發SWT應用兩點心得
原來沒有用過Java做圖形界面的客戶端程序, 只是知道簡單的一些Java圖形編程的原理. 近日一用, 還確實和Window下的其他開發方法方法大有不同. 我沒有用過AWT, 也沒用過SWING, 在網上看到這不好,那不行. 遂直接用SWT, 反正也能跨平臺.
1. Composite 刷新
本來這看起來很簡單, 但在composite.open()後, 動態創建了幾個Control, 運行起來就是不能顯示, 反而原有的control可以dispose()掉. 納悶, 想不通. 記得在考SCJP時, AWT還是SWING需要調用redraw()重新更新畫布, 調用之, 還是無效。
在網上也找不到動態創建控件的資源, 以爲SWT不支持動態創建, 剛想~!@#$%^&*()_+. 絕望中看SWT_Example, 發現裏面的LayoutExample居然實現了動態創建Button, 這不是俺要的嗎? 將代碼研讀一遍, 看看createDetailXXX, 沒有特殊的地方, 出去再看看調用, 使用了composite.layout(true) 方法. 回頭一試, 果然就是它.
回頭一想, 可能設計者不想讓我們看到控件一個個的跳出來, 於是設計了這麼一個方法, 讓控件一次刷屏.
2. Control父組件
Window程序動態創建一個控件時, 可以指定父控件爲Null, 再調用父組件的add方法就可以加入到組件樹中. SWT似乎不能支持, 如果指定控件的Composite爲Null, 將拋出異常. 必須指定一個父容器. 似乎不管3*7=21, 將shell作爲其parent, 然後調用composite.setParent()改變其parent, 想一想, 不行. 如果使用setParent方法改變, 其shell的control列表同樣保留這個控件的拷貝, 而在dispose()時總有不乾淨的乾淨的感覺.
原來搭好的框架, 因爲必須指定parent composite而放棄.