hhh

常用链接

统计

最新评论

2006年10月26日 #

SWT如何获得本地文件系统的图标等表示信息

 在swing中
  
  FileSystemView.getFileSystemView().getSystemDisplayName(file);
  
  
  FileSystemView.getFileSystemView().getSystemIcon(file);
  
  可以采用上面的方法得到。

  那SWT中如何做到呢?

posted @ 2006-10-30 16:20 hhh 阅读(1105) | 评论 (2)编辑 收藏

swing灵活和重用的艺术 renderer/editor

说到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/

posted @ 2006-10-28 16:44 hhh 阅读(1143) | 评论 (0)编辑 收藏

初探eclipse RCP 有些问题?

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的指点。

posted @ 2006-10-27 17:16 hhh 阅读(830) | 评论 (2)编辑 收藏

看JFace与Swing MVC的M

最近看Eclipse RCP稍微了解一下JFace,看了它的MVC架构有感!
  
  在JFace的ContentViewer抽象中下面的三个方法反映它对待模型的思路:
  public void setContentProvider(IContentProvidercontentProvider)
  
  public void setInput(Object input)
  
  
  public void setLabelProvider(IBaseLabelProvider labelProvider)
  
  显然setInput是用来配置view背后的数据,从它的参数类型(Object)来讲应该是你的与view无关的领域模型.
  
  从这里就可以看出它和swing的根本差异.swing各种不同viewer(在swing的世界叫JComponent)背后的模型是因不同组件而不同的,模型的接口是反应了该组件特征的.
  如 JTable 背后的TableModel,TableModel接口的定义基本表达了作为一个二维表格期望获得数据的方式如TableModel中有定义这样的方法:
  Objetc getValueAt(int row,int column)
  
  在JFace中直接可以放入Object类型数据,但各种viewer不一样对于拿数据的期望也不一样,
  ContentProvider,LabelProvider解决了上述问题,不同ContentProvider定义了该viewer所期望的拿数据的接口,其实我觉得swing中的model在意义上类似于ContentProvider.
  
  其实感觉JFace的做法在尽量强制你必须构建独立于GUI的模型.
  而swing的话并没有这种侵入性,你可以直接实现viewer的模型接口如
  
  class Mymodel implenents TableModel{
  
  }
  
  也可以定义比较独立的模型然后用对象适配器模式将它们适配到viewer model上!
  
  http://www.douban.com/group/topic/1159250/

posted @ 2006-10-26 18:45 hhh 阅读(1475) | 评论 (2)编辑 收藏