在swing中
FileSystemView.getFileSystemView().getSystemDisplayName(file);
FileSystemView.getFileSystemView().getSystemIcon(file);
可以采用上面的方法得到。
那SWT中如何做到呢?
說到GUI類庫的重用有一個很著名的模式:Composite模式。對,一個現代面向對象GUI類庫基本上都有這個模式的實現,當然也包括swing.不
過早一點如MFC就沒有完整的實現,現在來看如果一個GUI類庫連基本的Composite模式都沒有實現基本上感覺是出土的文物啦!
但是我們來看即便有了Composite模式,但Composite模式通常是構建靜態組合,如果要動態的替換一個復合組件內部的子元素如何辦呢?如此一來這個組件就只能定義自己的布局形式,而不能定死在這個布局形式內的元素。
其實從用戶角度來說一個GUI元素通常就是兩種情況要么就是表現,要么就是處于和用戶交互狀態,這是它們的形態通常不一樣。所以組件不僅僅要只定義自己的布局形式,還要給于外部機會來配置當自己的子元素處于這兩種狀態時相應的UI組件是什么!
swing通過renderer/editor達到了這種靈活性。如swing中JTable,JList,JTree等組件都只是定義了自
己的布局形式。并且都可以配置renderer/editor,這樣你的renderer/editor實現就接管了組件里面元素的表現形式和交互形態。
理論上你可以用任何JComponent作為組件里面元素的表現形式和交互形態。其靈活性和重用性達到了一個巔峰!
以前還聊過一個JTable的例子!
http://www.douban.com/group/topic/1112689/
public class Perspective implements IPerspectiveFactory {
public void createInitialLayout(IPageLayout layout) {
String er = layout.getEditorArea();
layout.setEditorAreaVisible(false);
layout.addView(FileTransfersView.DownloadID,IPageLayout.TOP , 0.25f, er);
layout.addView(FileTransfersView.UploadID,IPageLayout.BOTTOM , 0.25f, er);
}
}
比如有以上代碼,那么我如何獲得被加到layout的viewer實例呢?我發現本更無法獲得viewer實例的引用了。
plugin.xml文件的片斷
<extension
point="org.eclipse.ui.views">
<view
class="com.mt.ui.FileTransfersView"
id="com.mt.ui.FileTransfersView.Upload"
name="test1"/>
<view
class="com.mt.ui.FileTransfersView"
id="com.mt.ui.FileTransfersView.Download"
name="test2"/>
</extension>
很明顯兩個view的class是一個,因為我要重用這個view,它們只是有些屬性和背后的數據不一樣!我需要在初始化時將這些不一樣設定。
如果我的機會只有在這里
public void createPartControl(Composite parent) {
}
那么難道不同的View就要都通過繼承,然后重寫上面這個方法來做,這樣的話是不是過于呆板了!
還請熟悉eclipse RCP的指點。