Eclipse Rcp系列三 进一步了解Viewer

好在二的基础上,继续,这个时候我们须要增加一个Viewer.在这里我须要说一下,在eclipse的开发中用到的很多
的是Viewer(视图)这个概念,而不像Vb等开发中经常用到的window(窗口),并不是说Rcp中没有窗口,而是使用
频率较低,所以分别说一下如何添加窗口和Viewer

一,添加一个对话框窗口:添加一个类如下,然後在须要显视的地方调用一下open()方法
不一定非要继承自Dialog,这里为了渐少一些代码,而且我使用中也多继承自Dialog
package hellorcp;

import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Dialog;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;

public class HelloDialog extends Dialog {

 protected Object result;

 protected Shell shell;

 public HelloDialog(Shell parent, int style) {
  super(parent, style);
 }

 public HelloDialog(Shell parent) {
  this(parent, SWT.NONE);
 }
 public Object open() {
  createContents();
  shell.open();
  shell.layout();
  Display display = getParent().getDisplay();
  while (!shell.isDisposed()) {
   if (!display.readAndDispatch())
    display.sleep();
  }
  return result;
 }

 protected void createContents() {
  shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
  shell.setSize(500, 375);
  shell.setText("SWT Dialog");
  //
 }

}

二,添加一个viewer,首先建立一个viewer,下边是Designer(一个很好用的插件)自动生成的一个viewer,
也就是一个Viewer的大概结构
package hellorcp;

import org.eclipse.jface.action.IMenuManager;
import org.eclipse.jface.action.IToolBarManager;
import org.eclipse.swt.SWT;
import org.eclipse.swt.widgets.Composite;
import org.eclipse.ui.part.ViewPart;

public class HelloView extends ViewPart {

 public static final String ID = "hellorcp.HelloView"; //$NON-NLS-1$

 public void createPartControl(Composite parent) {
  Composite container = new Composite(parent, SWT.NONE);
  //
  createActions();
  initializeToolBar();
  initializeMenu();
 }

 private void createActions() {
  // Create the actions
 }
 private void initializeToolBar() {
  IToolBarManager toolbarManager = getViewSite().getActionBars()
    .getToolBarManager();
 }

 private void initializeMenu() {
  IMenuManager menuManager = getViewSite().getActionBars()
    .getMenuManager();
 }

 public void setFocus() {
  // Set the focus
 }

}
显视这个viewer,每个viewer须要加载到perspective上才能显视,所以在Perspective.java中加入如下代码
public void createInitialLayout(IPageLayout layout) {
 layout.setEditorAreaVisible(false);//不显视edit窗口
 String editorArea = layout.getEditorArea();
 //下边两句的不同是,一个显视的是单页窗口,一个显视的是多页窗口
 layout.addStandaloneView(HelloViewer.ID,false, IPageLayout.LEFT, 0.25f, editorArea);
 layout.addView(HelloViewer.ID, IPageLayout.RIGHT, 0.75f, editorArea);

三,在viewer或者dialog上添加控件,如果装有Designer可以直接拖放,如果没有编程实现也可以
大部份添加到下边这样的函数中
viewer:
public void createPartControl(Composite parent) {
  Composite container = new Composite(parent, SWT.NONE);
  //添加一个button
  final Button delBtn = new Button(container, SWT.NONE);
  delBtn.setText("删除");
  delBtn.setBounds(10, 83, 44, 22);
  addListener2DelBtn(delBtn);
  
  createActions();
  initializeToolBar();
  initializeMenu();
}
dialog:
protected void createContents() {
  shell = new Shell(getParent(), SWT.DIALOG_TRIM | SWT.APPLICATION_MODAL);
  shell.setSize(500, 375);
  shell.setText("SWT Dialog");

四,响应事件,SWT的事件响应和Swing是一样的,添加listener
delBtn.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    //加入你响应事件要做的事情
   }
});

五,布局
布局方面swt没有什么新的地方,发个简单使用布局的例子,参考吧.另外布局还有很多搭配,但不是本文的
重点,暂时带过
import org.eclipse.swt.SWT;
import org.eclipse.swt.events.SelectionEvent;
import org.eclipse.swt.events.SelectionListener;
import org.eclipse.swt.graphics.Font;
import org.eclipse.swt.graphics.Point;
import org.eclipse.swt.graphics.Rectangle;
import org.eclipse.swt.layout.FormAttachment;
import org.eclipse.swt.layout.FormData;
import org.eclipse.swt.layout.FormLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Table;
import org.eclipse.swt.widgets.TableColumn;
import org.eclipse.swt.widgets.TableItem;

public class TableDemo {

  /**
  * @param args
  */
  public static void main(String[] args) {
    Display   dispMain = new Display ();
   
    final Shell shellMain = new Shell (dispMain, SWT.TITLE | SWT.MIN | SWT.BORDER);
       
    shellMain.setText("Table Demo");
   
    FormLayout formLayout = new FormLayout();
    formLayout.marginLeft = 10;
    formLayout.marginRight = 10;
    formLayout.marginTop = 10;
    formLayout.marginBottom = 10;
    formLayout.spacing = 10;
    shellMain.setLayout(formLayout);

    shellMain.setSize(800, 600);
    Point size = shellMain.getSize();
    Rectangle rect = dispMain.getBounds();
    shellMain.setLocation(rect.x + (rect.width-size.x)/2, rect.y + (rect.height-size.y)/2);

    Table demoTable = (Table)createContents(shellMain);    
    FormData formData = new FormData();
    formData.left = new FormAttachment(0, 0);
    formData.top = new FormAttachment(0, 0);
    formData.right = new FormAttachment(100, 0);
    formData.bottom = new FormAttachment(100, -34);
    demoTable.setLayoutData(formData);

    Button btnClose = new Button(shellMain, SWT.PUSH | SWT.FLAT);
    btnClose.setText("close");
   
    formData = new FormData();
    formData.right = new FormAttachment(100, 0);
    formData.top = new FormAttachment(demoTable, 0);
    formData.width = 100;
    formData.bottom = new FormAttachment(100, 0);
    btnClose.setLayoutData(formData);
   
    btnClose.addSelectionListener(
        new SelectionListener() {
          public void widgetDefaultSelected(SelectionEvent e) {
            this.widgetSelected(e);
          }
         
          public void widgetSelected(SelectionEvent e) {
            shellMain.close();
          }
        }
    );
    shellMain.open ();
   
    while (!shellMain.isDisposed ()) {
        if (!dispMain.readAndDispatch ()) {
          dispMain.sleep ();
        }
    }
    dispMain.dispose ();
    dispMain = null;
  }

  /**
  *
  * @param shellMain
  * @return
  */
  private static Table createContents(Shell shellMain) {
    Table table = new Table(shellMain, SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
    table.setHeaderVisible(true);
    table.setLinesVisible(true);
    table.setFont(new Font(shellMain.getDisplay(), "Arial", 11, SWT.BOLD));
   
    TableColumn colNumber = new TableColumn(table, SWT.NONE);
    TableColumn colMedName = new TableColumn(table, SWT.CENTER);
    TableColumn colPrice = new TableColumn(table, SWT.CENTER);
    TableColumn colUnit = new TableColumn(table, SWT.CENTER);
    TableColumn colCount = new TableColumn(table, SWT.CENTER);
   
    colNumber.setWidth(25);
   
    colMedName.setWidth(150);
    colMedName.setText("Medicine Name");
   
    colPrice.setWidth(150);
    colPrice.setText("Medicine Price");
   
    colUnit.setWidth(150);
    colUnit.setText("Medicine Unit");
   
    colCount.setWidth(150);
    colCount.setText("Medicine Count");
   
    for(int i=0; i<10; i++) {
        TableItem item = new TableItem(table, SWT.NONE);
        item.setText(new String[]{i+1+"","4/2","4/3","4/4","4/5","4/6","4/7","4/8","4/9"});
    }
    return table;
  }
}
五,加入 右键 ,双击
加入两个listener
//右键
private void hookContextMenu() {
  MenuManager menuMgr = new MenuManager("#PopupMenu"); //$NON-NLS-1$
  menuMgr.setRemoveAllWhenShown(true);
  menuMgr.addMenuListener(new IMenuListener() {
   public void menuAboutToShow(IMenuManager manager) {
    HelloView.this.fillContextMenu(manager);
   }
  });
  Menu menu = menuMgr.createContextMenu(viewer.getControl());
  viewer.getControl().setMenu(menu);
  getSite().registerContextMenu(menuMgr, viewer);
}
private void fillContextMenu(IMenuManager manager) {
  manager.add(addAction);
  manager.add(modifyAction);
  manager.add(deleteAction);
  manager.add(new Separator(IWorkbenchActionConstants.MB_ADDITIONS));
}
//双击
private void hookDoubleClickAction() {
  viewer.addDoubleClickListener(new IDoubleClickListener() {
   public void doubleClick(DoubleClickEvent event) {
    //doubleClickAction.run();
   }
  });
}

六,使用TableViewer
Jface中封装了talbeViewer TreeViewer等控件,能简单的实现很多功能,首先说说TableView
//SWT.FULL_SELECTION 可以选中一整行
//SWT.MULTI 可以选中多行
viewer = new TableViewer(wareListGroup, SWT.BORDER | SWT.FULL_SELECTION
    | SWT.MULTI);
  final Table table = viewer.getTable();
  table.setHeaderVisible(true);//显视表头
  table.setLinesVisible(true);//显视表格
  
  //实现点击表头自动重新排序
  final TableColumn num = new TableColumn(table, SWT.NONE);
  num.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    resetSort(WareViewerSort.NUM);
    //resetSort是自己实现的重新排序的函数,只须要把不通的ViewerSort重新设置给
    TableViewer,并刷新
   }
  });
  num.setAlignment(SWT.CENTER);
  num.setWidth(50);
  //这个地方使用了message,只要做过国际话的大概都能明白
  num.setText(Messages.getString("HelloView.warenum")); //$NON-NLS-1$

  final TableColumn name = new TableColumn(table, SWT.NONE);
  name.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    resetSort(WareViewerSort.NAME);//同上
   }
  });
  name.setWidth(80);
  name.setText(Messages.getString("WareView.warename")); //$NON-NLS-1$
  name.setAlignment(SWT.CENTER);
  
  final TableColumn desc = new TableColumn(table, SWT.NONE);
  desc.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    resetSort(WareViewerSort.DESC);
   }
  });
  desc.setWidth(110);
  desc.setText(Messages.getString("WareView.waredesc")); //$NON-NLS-1$

  final TableColumn price = new TableColumn(table, SWT.NONE);
  price.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    resetSort(WareViewerSort.PRICE);
   }
  });
  price.setWidth(70);
  price.setText(Messages.getString("WareView.wareprice")); //$NON-NLS-1$
  price.setAlignment(SWT.RIGHT);

  final TableColumn updDate = new TableColumn(table, SWT.NONE);
  updDate.addSelectionListener(new SelectionAdapter() {
   public void widgetSelected(SelectionEvent e) {
    resetSort(WareViewerSort.UPDDATE);
   }
  });
  updDate.setWidth(150);
  updDate.setText(Messages.getString("WareView.wareupddate")); //$NON-NLS-1$
  updDate.setAlignment(SWT.CENTER);
  //一个TableViewer里边的数据变动主要取决于下边四句
  viewer.setContentProvider(new WareContentProvider()); //表的显视
  viewer.setLabelProvider(new WareLabelProvider());    //表的数据提供者

  viewer.setInput(//真实的数据来源); //数据来源例如ArrayList等
  viewer.setSorter(new WareViewerSort()); //排序
  
两个provider的实现类似下边的情况  
class WareContentProvider implements IStructuredContentProvider {

  public Object[] getElements(Object inputElement) {
   if (inputElement instanceof Node) {
    ArrayList list = new ArrayList();
    makeWareList(((Node) inputElement), list);
    return list.toArray();
   }
   if (inputElement instanceof List) {
    return ((List) inputElement).toArray();
   }
   return null;
  }

  public void dispose() {
   // TODO Auto-generated method stub

  }

  public void inputChanged(Viewer viewer, Object oldInput, Object newInput) {
   // TODO Auto-generated method stub

  }

 }

class WareLabelProvider extends LabelProvider implements
   ITableLabelProvider {

  public Image getColumnImage(Object element, int columnIndex) {
   // TODO Auto-generated method stub
   return null;
  }

  public String getColumnText(Object element, int columnIndex) {
   if (element instanceof Ware) {
    switch (columnIndex) {
    case 0:
     return ((Ware) element).getDisplayNum();
    case 1:
     return ((Ware) element).getDisplayName();
    case 2:
     return ((Ware) element).getDisplayDesc();
    case 3:
     return ((Ware) element).getDisplayPrice();
    case 4:
     return ((Ware) element).getDisplayUpdDate();
    default:
     break;
    }
   }
   return null;
  }

 }
 

目 录 1.富客户端平台 1 1.1.概述 1 1.2.Eclipse RCP 建设风格——插件,扩展和扩展点 1 2.创建你的第一个RCP程序 1 2.1.创建一个RCP程序 2 2.2.启动你的RCP程序 5 2.3.应用程序VS 产品 6 3.应用程序里的插件ID 7 4.Actions的用法(菜单和工具栏) 7 4.1.概述 7 4.2.通过编码添加 8 4.3.由“扩展”方式向程序添加菜单和工具栏 11 5.添加组合键 19 5.1.概述 19 5.2.声明actions的组合键 19 6.系统托盘 24 7.外观 30 7.1.向程序中添加视图模板 31 7.2.向应用程序添加VIEW 36 7.3.向VIEW里添加action 40 8.和编辑器一起工作 51 8.1.概述 51 8.2.创建工程 51 8.3.创建并准备domain 模型 51 8.4.在视口中使用domain模型 57 8.5.加入编辑器 58 8.6.调用编辑器 66 8.7.向编辑器提供内容 70 9.对话框 71 9.1概述 71 9.2.预定义的对话框 71 9.2.1.概述 71 9.2.2.创建工程 71 9.2.3.声明action 71 9.2.4.调用对话框 71 9.3.用户自定义对话框 74 9.3.1.概述 74 9.3.2.创建工程 74 9.3.3.声明action 74 9.3.4.声明action 74 9.3.5.创建对话框 75 10.向导(wizard) 77 10.1.概述 77 10.2.例子 77 11.首选项 85 11.1 首选项 85 11.2.使用首选项 85 11.3.首选项页 91 12.添加状态条 97 12.1.安装状态条 97 12.2.共享状态条 98 13.透视 103 13.1.向你的程序中添加透视图 103 13.2.使透视图可选。 107 13.2.1.使透视图可由一个coolbar可选 107 13.2.2.使透视图可通过菜单选择。 109 14.进度报告 112 15.将外部类包含进你的程序 118 15.1.概述 118 15.2.向构建路径中添加jar 118 15.3.使jar在你的运行路径里有效 119 16.提示和策略 120 16.1.控制台日志 120 16.2.保存用户的布局 121 16.3.获得display 122 16.4.使用eclipse的“保存”action 123 16.5.装载模型 127 16.6.向你的程序添加错误日志视口 127 17.制造一个产品 129 17.1.概述 129 17.2.创建一个工程 130 17.3.测试你的产品 134 18.商标 134 18.1.欢迎页面 134 18.2.商标 135 18.3.风格化launcher 136 19.发布你的产品 137 20.发布引入外部jar的产品 141 20.1.整合外部jar和第方库 141 Tip 142 21.1.创建一个新工程 144 21.2.创建一个产品 144 21.3.添加依赖性 145 21.4.向程序中添加action 146 21.5.创建一个帮助插件工程////原著写的不好 149 22.附录:配置文件 152 22.1.概述 152 22.2..project 153 22.3.Manifest.MF 154 23.附录:使用接口技术 154 23.2.Jface 154
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值