好在二的基础上,继续,这个时候我们须要增加一个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;
}
}
分享到:
相关推荐
在本"Common Navigator demo"中,我们将深入探讨如何利用Eclipse RCP创建一个基于Common Navigator的简单应用,并了解如何扩展这一基础功能。 首先,Common Navigator是Eclipse RCP中用于显示项目、文件和其他资源...
Eclipse RCP(Rich Client Platform)是一个开源框架,用于构建功能丰富的桌面应用程序。它提供了构建专业级应用所需的基础架构,包括窗口系统、插件机制、工作台管理等。本示例是一个Eclipse RCP的实战演示,展示了...
首先,我们需要了解Eclipse RCP的基础。Eclipse RCP的核心概念是组件化,它通过插件系统实现了模块化的应用程序结构。每个插件代表应用程序的一个功能或一组相关功能,它们可以通过API互相通信。开发者可以基于...
### Eclipse RCP 教程知识点概述 #### 一、Eclipse RCP 概览 - **定义**:Eclipse RCP(Rich Client Platform)是一种基于Java的框架和技术集合,允许开发者构建灵活且可扩展的桌面应用程序。 - **目标**:通过提供...
在Eclipse RCP(Rich Client Platform)开发中,创建用户友好的界面是至关重要的。一个常见的需求是定制透视图(Perspective)的交互方式,包括切换按钮和右键菜单。本教程将详细介绍如何通过`org.eclipse.ui....
同时,Eclipse RCP提供了一套强大的事件机制,使得VIEWER和EDITOR之间的通信变得简单,例如,当用户在VIEWER中选择了一个项时,可以触发一个事件,使得相关的EDITOR更新其内容以反映所选项的详细信息。 总的来说,...
RCP应用是由一系列插件组成的,每个插件负责提供特定的功能。对于一个JAVA编辑器来说,可能包含以下插件: 1. **编辑器插件**:这是核心插件,提供代码编辑功能。JavaViewer.java文件很可能就是这个插件的一部分,...
作为Eclipse项目的一部分,GridViewer与Eclipse RCP有着良好的集成,可以轻松地在RCP应用中使用,使得开发企业级桌面应用变得更加便捷。 综上所述,"org.eclipse.nebula.widgets.grid_1.0.0.jar"是Eclipse Nebula...
Birt项目就是基于Eclipse RCP(Rich Client Platform)构建的,因此,Birt Viewer的源代码同样遵循了Eclipse插件开发的模式。 Birt Viewer源代码中包含的主要组件有: 1. **Web Application Framework**:Birt ...
相较于传统的SWT或SWING开发,RCP充分利用了Eclipse的插件机制,不仅能够继承Eclipse优秀的UI设计和功能架构,还能进一步扩展和定制,使之成为理想的Java桌面应用开发解决方案。 RCP的核心优势在于它允许开发者构建...
RCP是Eclipse框架下的一种应用程序开发模型,它允许开发者创建功能丰富的桌面应用程序。在RCP程序中添加帮助系统,可以采用Eclipse提供的Help System API。这个API允许开发者构建结构化的帮助内容,包括HTML文档、...
SWT,全称为Standard Widget Toolkit,是...使用SWT时,开发者需要对Java、操作系统API以及Eclipse RCP有一定的了解,才能充分发挥其潜力。对于初学者,查阅官方文档、示例代码以及相关的教程资源是快速上手的关键。
综上所述,JFace Viewer是Eclipse RCP开发中强大且灵活的工具,它通过提供数据与界面之间的桥梁,极大地简化了复杂视图的实现。通过对数据模型的控制,开发者可以创建出功能丰富的用户界面,同时享受到SWT的高性能和...
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 ...
通过这个开源项目,开发者可以学习如何利用Eclipse RCP构建桌面应用,了解如何设计和实现插件系统,以及如何创建和管理开源项目。对于用户而言,他们可以获得一个免费且可定制的论坛离线查看工具,提升无网环境下的...
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 有关项目的更多...
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的源码分析可以帮助我们深入理解其内部工作原理,提高开发效率,特别是对于那些需要定制化Eclipse插件或者RCP(Rich Client Platform)应用的开发者来说,研究源码是非常有价值的。 首先,JFace的核心概念包括...
- 第三篇教程讲解了如何在Eclipse RCP应用程序中实现高级特性。 - 包括创建和管理视图、实现插件间通信等。 - 这些高级技巧对于构建复杂的应用程序非常重要。 通过以上资源和知识点的梳理,我们不仅可以深入了解...