`
dreamstone
  • 浏览: 289583 次
  • 来自: ...
文章分类
社区版块
存档分类

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;
  }

 }
 

分享到:
评论

相关推荐

    Eclipse Rcp comon Navigator demo

    在本"Common Navigator demo"中,我们将深入探讨如何利用Eclipse RCP创建一个基于Common Navigator的简单应用,并了解如何扩展这一基础功能。 首先,Common Navigator是Eclipse RCP中用于显示项目、文件和其他资源...

    eclipse rcp demo例子 view editor 图表

    Eclipse RCP(Rich Client Platform)是一个开源框架,用于构建功能丰富的桌面应用程序。它提供了构建专业级应用所需的基础架构,包括窗口系统、插件机制、工作台管理等。本示例是一个Eclipse RCP的实战演示,展示了...

    eclipse RCP开发一个简单的MYSQL客户端工具介绍

    首先,我们需要了解Eclipse RCP的基础。Eclipse RCP的核心概念是组件化,它通过插件系统实现了模块化的应用程序结构。每个插件代表应用程序的一个功能或一组相关功能,它们可以通过API互相通信。开发者可以基于...

    Eclipse RCP教程

    ### Eclipse RCP 教程知识点概述 #### 一、Eclipse RCP 概览 - **定义**:Eclipse RCP(Rich Client Platform)是一种基于Java的框架和技术集合,允许开发者构建灵活且可扩展的桌面应用程序。 - **目标**:通过提供...

    RCP自定义透视图切换按钮的右键菜单

    在Eclipse RCP(Rich Client Platform)开发中,创建用户友好的界面是至关重要的。一个常见的需求是定制透视图(Perspective)的交互方式,包括切换按钮和右键菜单。本教程将详细介绍如何通过`org.eclipse.ui....

    RCP的VIEWER和EDITOR

    同时,Eclipse RCP提供了一套强大的事件机制,使得VIEWER和EDITOR之间的通信变得简单,例如,当用户在VIEWER中选择了一个项时,可以触发一个事件,使得相关的EDITOR更新其内容以反映所选项的详细信息。 总的来说,...

    RCP版JAVA 编辑器

    RCP应用是由一系列插件组成的,每个插件负责提供特定的功能。对于一个JAVA编辑器来说,可能包含以下插件: 1. **编辑器插件**:这是核心插件,提供代码编辑功能。JavaViewer.java文件很可能就是这个插件的一部分,...

    org.eclipse.nebula.widgets.grid_1.0.0.jar_gridview_everyt8y_

    作为Eclipse项目的一部分,GridViewer与Eclipse RCP有着良好的集成,可以轻松地在RCP应用中使用,使得开发企业级桌面应用变得更加便捷。 综上所述,"org.eclipse.nebula.widgets.grid_1.0.0.jar"是Eclipse Nebula...

    birt viewer源代码

    Birt项目就是基于Eclipse RCP(Rich Client Platform)构建的,因此,Birt Viewer的源代码同样遵循了Eclipse插件开发的模式。 Birt Viewer源代码中包含的主要组件有: 1. **Web Application Framework**:Birt ...

    RCP开发指南

    相较于传统的SWT或SWING开发,RCP充分利用了Eclipse的插件机制,不仅能够继承Eclipse优秀的UI设计和功能架构,还能进一步扩展和定制,使之成为理想的Java桌面应用开发解决方案。 RCP的核心优势在于它允许开发者构建...

    为RCP程序添加帮助支持

    RCP是Eclipse框架下的一种应用程序开发模型,它允许开发者创建功能丰富的桌面应用程序。在RCP程序中添加帮助系统,可以采用Eclipse提供的Help System API。这个API允许开发者构建结构化的帮助内容,包括HTML文档、...

    swt原生库(用java开发swt用)

    SWT,全称为Standard Widget Toolkit,是...使用SWT时,开发者需要对Java、操作系统API以及Eclipse RCP有一定的了解,才能充分发挥其潜力。对于初学者,查阅官方文档、示例代码以及相关的教程资源是快速上手的关键。

    JFace-viewer

    综上所述,JFace Viewer是Eclipse RCP开发中强大且灵活的工具,它通过提供数据与界面之间的桥梁,极大地简化了复杂视图的实现。通过对数据模型的控制,开发者可以创建出功能丰富的用户界面,同时享受到SWT的高性能和...

    Eclipse权威开发指南2.pdf

    2.2.2 了解Eclipse用户界面..... 22 2.2.3 任务、书签和问题..... 28 2.2.4 后台处理..... 29 2.2.5 Eclipse的帮助功能..... 30 2.3 资源管理...... 36 2.3.1 工作空间..... 36 2.3.2 有关项目的更多内容..... 42 ...

    Forums Offline Viewer for Eclipse-开源

    通过这个开源项目,开发者可以学习如何利用Eclipse RCP构建桌面应用,了解如何设计和实现插件系统,以及如何创建和管理开源项目。对于用户而言,他们可以获得一个免费且可定制的论坛离线查看工具,提升无网环境下的...

    Eclipse权威开发指南3.pdf

    2.2.2 了解Eclipse用户界面..... 22 2.2.3 任务、书签和问题..... 28 2.2.4 后台处理..... 29 2.2.5 Eclipse的帮助功能..... 30 2.3 资源管理...... 36 2.3.1 工作空间..... 36 2.3.2 有关项目的更多...

    Eclipse权威开发指南1.pdf

    2.2.2 了解Eclipse用户界面..... 22 2.2.3 任务、书签和问题..... 28 2.2.4 后台处理..... 29 2.2.5 Eclipse的帮助功能..... 30 2.3 资源管理...... 36 2.3.1 工作空间..... 36 2.3.2 有关项目的更多...

    JFace的源码,从官网下的

    JFace的源码分析可以帮助我们深入理解其内部工作原理,提高开发效率,特别是对于那些需要定制化Eclipse插件或者RCP(Rich Client Platform)应用的开发者来说,研究源码是非常有价值的。 首先,JFace的核心概念包括...

    SWT-resource address

    - 第三篇教程讲解了如何在Eclipse RCP应用程序中实现高级特性。 - 包括创建和管理视图、实现插件间通信等。 - 这些高级技巧对于构建复杂的应用程序非常重要。 通过以上资源和知识点的梳理,我们不仅可以深入了解...

Global site tag (gtag.js) - Google Analytics