|
|
爱运动的围巾 · uni-app升级后图片上传至阿里云OSS报 ...· 11 月前 · |
|
|
博学的上铺 · mongoTemplate 写入数据 ...· 1 年前 · |
|
|
失恋的青椒 · JS中数组(Array)和字典(Map)的常 ...· 1 年前 · |
|
|
逆袭的大象 · Nest.js 从零到壹系列(三):使用 ...· 2 年前 · |
|
|
小胡子的沙发 · Win10+Android ...· 2 年前 · |
最近在客户端软件开发过程中,使用到了Eclipse RCP的若干技术,有种相见很晚的感觉。尽管自己在日常开发中也使用了SWT中的若干技术,在运用了Theme之后看起来也让人眼前一亮,但是比起RCP就相当于闭门造车了,例如下面两幅图片,就是SWT技术和RCP技术开发出的不同界面,后者看起来是不是很炫呢,用流行的话来讲,就是使用户的体验更rich了,呵呵。
SWT界面:
Eclipse RCP界面:
好了,既然Eclipse RCP开发出的界面如此漂亮,那我们就可以借助Eclipse RCP平台中各类UI组件来改善应用程序上的UI缺陷,通过RCP平台上的各类丰富的GUI视图,来打造赏心悦目的应用程序。但是在RCP开发的过程中,UI视图之间是相互依赖的,需要进行交互,目前国内教程对这一步骤往往语焉不详,下文就以实例的形式详细介绍Eclipse RCP View视图之间的交互机制,并总结了开发过程中的一些注意事项,避免大家绕了弯路,呵呵。
(一)下载最新的Eclipse RCP开发环境
开发RCP的首要前提是下载RCP开发环境,从
http://www.eclipse.org/
上可以下载,下载之后是个zip格式文件,解压到任何目录下都可以直接运行,前提是装好jdk。在Eclipse的官方网站上,针对不同的开发环境,已经为我们打好了不同的package,只要下载专门用来开发RCP的package即可。当然如果你已经安装了Eclipse普通开发环境,想增加RCP相关的开发功能,需要通过Eclipse的update功能来添加就可以了,不过后者采用在线安装的方式,容易引起packge插件下载不全,导致开发时出现莫明其妙的错误,因此推荐第一种方案。
(二)新建并运行Eclipse RCP项目
Eclipse安装并启动完毕之后,我们可以以插件的形式新增一个RCP模块,在该模块的基础上再添加不同的视图,这样就为下一步打下了良好的基础:
在Eclipse的Package Explorer中单击右键,选择菜单第一项“new”,在弹出的子菜单中选择“other”,在对话框中如下图选择:
在弹出对话框的“project name”栏中填入自己的项目名称,例如“hellorcp“,其余选项保持默认状态,点击下一步,在Plugin content对话框中“Rich Client Application”中,选择"YES",如下图所示:
选择YES表示除了新建一个插件之外,还愿意将其转换成一个RCP应用,以便以后脱离Eclipse开发环境而独立部署,而插件是不能独立运行的,必须依附Eclipse而运行。
点击下一步,选择一个模版,如下图所示:
点击Finish,在出现的最后对话框中选择“static content”,点击完成,这样就完成了向导方式下的Eclipse RCP项目hellorcp的创建,下面是该RCP项目在package explorer中的视图:
至此,我们已经创建了一个hellorcp的项目,在右边的editor窗口中,自动出现了hellorcp的启动视图,点击"Testing"中的“launch”链接,可以启动该rcp项目:
大功告成,我们得到了一个可以运行的Eclipse RCP项目,Eclipse RCP的项目创建过程是不是非常简单呢?现在的界面就像一个白板,我们已经迫不及待地想在上面丰富我们的视图了,接下来我们的任务是创建不同的视图,并添加代码让它们动起来,在做这些之前,介绍一下Eclipse RCP上面的一些概念:
(三)Eclipse RCP 术语介绍:
public
Object start(IApplicationContext context)
{
Display display
=
PlatformUI.createDisplay();
try
{
int
returnCode
=
PlatformUI.createAndRunWorkbench(display,
new
ApplicationWorkbenchAdvisor());
if
(returnCode
==
PlatformUI.RETURN_RESTART)
{
return
IApplication.EXIT_RESTART;
}
return
IApplication.EXIT_OK;
}
finally
{
display.dispose();
}
}
public
class
ApplicationWorkbenchAdvisor extends WorkbenchAdvisor
{
private
static
final String PERSPECTIVE_ID
=
"
hellorcp.perspective
"
;
public
WorkbenchWindowAdvisor createWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)
{
return
new
ApplicationWorkbenchWindowAdvisor(configurer);
}
public
void
initialize(IWorkbenchConfigurer configurer)
{
super.initialize(configurer);
configurer.setSaveAndRestore(
true
);
}
public
String getInitialWindowPerspectiveId()
{
return
PERSPECTIVE_ID;
}
public
ApplicationWorkbenchWindowAdvisor(IWorkbenchWindowConfigurer configurer)
{
super
(configurer);
}
public
ActionBarAdvisor createActionBarAdvisor(IActionBarConfigurer configurer)
{
return
new
ApplicationActionBarAdvisor(configurer);
}
public
void
preWindowOpen()
{
IWorkbenchWindowConfigurer configurer
=
getWindowConfigurer();
configurer.setInitialSize(
new
Point(
700
,
550
));
configurer.setShowCoolBar(
false
);
configurer.setShowStatusLine(
false
);
configurer.setTitle(
"
RCP Product
"
);
}
protected
void
makeActions(IWorkbenchWindow window)
{
introAction
=
ActionFactory.INTRO.create(window);
register(introAction);
}
(四)创建视图
如上所示,我们已经了解了Eclipse RCP上的一些概念,每个类各司其职,共同组成了美妙的窗口和布局,这就是Eclipse的魅力,在下面我们就着手创建视图,在接下来的章节中,上面介绍的概念都要用到。
视图(View 和ViewPart)
视图,视图是为了方便用户编辑提供一些辅助功能或编辑一些属性。比如最常见的
Outline
视图往往用来提供当前编辑的文档的结构,而在Eclipse开发环境菜单项"window"中,选择"show view"项,还可以看到更多的视图。如果用户使用Eclipse的PDE来开发Java程序,往往一个java文件打开,都伴随着不同视图的出现,从而为开发人员提供了不同的观察代码及其运行方式的窗口。
下面我们就使用向导创建第一个视图:navigationView视图。
点击hellorcp项目中的plugin.xml文件,在editor中打开整个hellorcp项目的视图。这里要补充一下,plugin.xml是整个Eclipse RCP项目的配置文件,主要描述了插件之间的依赖关系,以及插件内部扩展的模块等等项目元数据信息。Eclipse提供了plugin.xml的可视化编辑方式,减轻了直接编辑xml的复杂度。
一般来说,创建视图可以通过使用Eclipse的Extension机制来完成,通过继承Eclipse的Views组件,可以创建一个简单的视图。
点击“finish”,就可以在extensions视图里看到新增的org.eclipse.ui.views扩展点,右键单击该扩展点,选择新建view,如下图:
在视图右边的新建view对话框中,填入view的名称:navigationView,如下图所示:
目前我们已经在plugin.xml中定义了navigationview扩展点,现在为该navigationview添加实现类,在上图的
class*
文本上点击"ctl+enter",可以打开新建navigationview class的界面:
点击保存,我们现在就得到了一个navigation view,而eclipse自动在plugin.xml文件中自动添加了有关配置片段:
<
extension
point
="org.eclipse.ui.views"
>
<
view
class
="hellorcp.NavigationViewPart"
id
="hellorcp.navigationview"
name
="navigationview"
>
</
view
>
</
extension
>
通过以上步骤,我们得到了一个视图类,现在我们就可以回到eclipse开发环境中,点击package explorer中的NavigationViewPart文件,
注意NavigationViewPart类中的createPartControl方法,视图中的表格、按钮之类的控件部分代码都是在该方法中创建的,现在我们在该方法中创建一个List,用来浏览我们提供的对象信息。注意Eclipse RCP是建立在jface基础上的,后者在swt的基础上对一些常用控件,例如表格、列表,树等做了封装,采用Viewer来提供视图,content provider和input model来提供模型,label provider来提供标签。因此要想创建列表并显示列表内容,必须同时创建上述几个对象,同时,为了填充数据模型,我们同时也创建了示例性质的Person对象以及相关辅助代码。如果在正式的环境中,这些model可以从数据库获得,在这里我们仅做示范性使用。以下依次是创建代码:
(1)模型:Person.class 和PersonModel.class
Person.class
package
hellorcp;
public
class
Person
{
private
String name;
private
String sex;
public
String getName()
{
return
name;
public
void
setName(String name)
{
this
.name
=
name;
public
String getSex()
{
return
sex;
public
void
setSex(String sex)
{
this
.sex
=
sex;
PersonModel.class
package
hellorcp;
import
java.util.ArrayList;
public
class
PersonModel
{
private
ArrayList
<
Person
>
list
=
new
ArrayList
<
Person
>
();
public
PersonModel()
{
//
硬编码,初始化数据示例
Person p1
=
new
Person();
p1.setName(
"
毛毛
"
);
p1.setSex(
"
男
"
);
list.add(p1);
Person p2
=
new
Person();
p2.setName(
"
皮皮
"
);
p2.setSex(
"
女
"
);
list.add(p2);
public
ArrayList
<
Person
>
elements()
{
return
list;
(2)LabelProvider
package
hellorcp;
import
org.eclipse.jface.viewers.ILabelProvider;
import
org.eclipse.jface.viewers.ILabelProviderListener;
import
org.eclipse.jface.viewers.LabelProvider;
import
org.eclipse.jface.viewers.LabelProviderChangedEvent;
import
org.eclipse.swt.graphics.Image;
public
class
NavigationViewLabelProvider
implements
ILabelProvider
{
public
Image getImage(Object element)
{
//
TODO Auto-generated method stub
return
null
;
public
String getText(Object element)
{
//
TODO Auto-generated method stub
return
((Person)element).getName();
public
void
addListener(ILabelProviderListener listener)
{
//
TODO Auto-generated method stub
public
void
dispose()
{
//
TODO Auto-generated method stub
public
boolean
isLabelProperty(Object element, String property)
{
//
TODO Auto-generated method stub
return
false
;
public
void
removeListener(ILabelProviderListener listener)
{
//
TODO Auto-generated method stub
public
void
labelProviderChanged(LabelProviderChangedEvent event)
{
//
TODO Auto-generated method stub
(3)content provider
package
hellorcp;
import
org.eclipse.jface.viewers.ILabelProviderListener;
import
org.eclipse.jface.viewers.IStructuredContentProvider;
import
org.eclipse.jface.viewers.ListViewer;
import
org.eclipse.jface.viewers.Viewer;
public
class
NavigationListViewContentProvider
implements
IStructuredContentProvider
{
PersonModel input;
ListViewer viewer;
public
Object[] getElements(Object inputElement)
{
//
TODO Auto-generated method stub
return
input.elements().toArray();
}
public
String getText(Object element)
{
return
((Person) element).getName();
}
public
void
inputChanged(Viewer viewer, Object oldInput, Object newInput)
{
viewer
=
(ListViewer) viewer;
input
=
(PersonModel) newInput;
}
public
void
addListener(ILabelProviderListener listener)
{
//
TODO 自动生成方法存根
}
public
void
add(Person p)
{
viewer.add(p);
}
public
void
remove(Person p)
{
viewer.remove(p);
}
public
void
dispose()
{
//
TODO Auto-generated method stub
}
(4)以下navigation view部分的代码
package
hellorcp;
import
org.eclipse.jface.action.IToolBarManager;
import
org.eclipse.jface.viewers.IStructuredContentProvider;
import
org.eclipse.jface.viewers.ListViewer;
import
org.eclipse.swt.SWT;
import
org.eclipse.swt.widgets.Composite;
import
org.eclipse.ui.part.ViewPart;
import
hellorcp.NavigationViewLabelProvider;
public
class
NavigationViewPart
extends
ViewPart
{
public
NavigationViewPart()
{
//
TODO Auto-generated constructor stub
}
@Override
public
void
createPartControl(Composite parent)
{
final
ListViewer listViewer
=
new
ListViewer(parent, SWT.BORDER);
listViewer.setLabelProvider(
new
NavigationViewLabelProvider());
listViewer.setContentProvider(
new
NavigationListViewContentProvider());
initializeToolBar();
//
TODO Auto-generated method stub
}
@Override
public
void
setFocus()
{
//
TODO Auto-generated method stub
}
private
void
initializeToolBar()
{
IToolBarManager toolBarManager
=
getViewSite().getActionBars().getToolBarManager();
}
(5)最后,我们将创建的navigationview添加到perspective透视图中
package
hellorcp;
import
org.eclipse.jface.action.IToolBarManager;
import
org.eclipse.jface.viewers.IStructuredContentProvider;
import
org.eclipse.jface.viewers.ListViewer;
import
org.eclipse.swt.SWT;
import
org.eclipse.swt.widgets.Composite;
import
org.eclipse.ui.part.ViewPart;
import
hellorcp.NavigationViewLabelProvider;
public
class
NavigationViewPart
extends
ViewPart
{
public
NavigationViewPart()
{
//
TODO Auto-generated constructor stub
}
@Override
public
void
createPartControl(Composite parent)
{
final
ListViewer listViewer
=
new
ListViewer(parent, SWT.BORDER);
listViewer.setLabelProvider(
new
NavigationViewLabelProvider());
listViewer.setContentProvider(
new
NavigationListViewContentProvider());
listViewer.setInput(
new
PersonModel());
initializeToolBar();
//
TODO Auto-generated method stub
}
@Override
public
void
setFocus()
{
//
TODO Auto-generated method stub
}
private
void
initializeToolBar()
{
IToolBarManager toolBarManager
=
getViewSite().getActionBars().getToolBarManager();
}
至此,我们已经创建了一个可以浏览人员信息的navigation view,运行一下我们创建的视图,可以得到如下效果,注意运行前需要将eclipse文件夹中以runtime...开头的文件夹删除,这是eclipse上次运行时创建的临时文件,如果不删除,就看不到修改之后的效果:
OK,现在我们已经创建了一个视图,我们还需要创建另外一个details视图,用来显示人员的若干详细信息,按照上述创建视图的方法,我们同样可以创建该视图,以下就不赘述了,只贴出创建detail view视图的代码和perspective透视图部分的代码:
(一)Detail view
package
hellorcp;
import
java.beans.PropertyChangeEvent;
import
java.util.AbstractList;
import
java.util.ArrayList;
import
java.util.Iterator;
import
org.eclipse.core.runtime.Preferences.IPropertyChangeListener;
import
org.eclipse.jface.action.IToolBarManager;
import
org.eclipse.jface.viewers.ISelection;
import
org.eclipse.jface.viewers.IStructuredSelection;
import
org.eclipse.jface.viewers.ISelectionChangedListener;
import
org.eclipse.jface.viewers.SelectionChangedEvent;
import
org.eclipse.jface.viewers.TableViewer;
import
org.eclipse.swt.SWT;
import
org.eclipse.swt.events.SelectionAdapter;
import
org.eclipse.swt.widgets.Composite;
import
org.eclipse.swt.widgets.Group;
import
org.eclipse.swt.widgets.Label;
import
org.eclipse.swt.widgets.Table;
import
org.eclipse.swt.widgets.Text;
import
org.eclipse.ui.ISelectionListener;
import
org.eclipse.ui.IWorkbenchPart;
import
org.eclipse.ui.part.ViewPart;
public
class
DetailView
extends
ViewPart
{
private
Table table;
private
Text text_1;
private
Text text;
@SuppressWarnings(
"
unchecked
"
)
ArrayList myListeners;
private
ISelection selection;
public
DetailView()
{
super
();
//
TODO Auto-generated constructor stub
}
@Override
public
void
createPartControl(Composite parent)
{
final
Composite composite
=
new
Composite(parent, SWT.NONE);
final
Group group
=
new
Group(composite, SWT.NONE);
group.setBounds(
0
,
0
,
494
,
62
);
final
Label label
=
new
Label(group, SWT.NONE);
label.setText(
"
姓名
"
);
label.setBounds(
10
,
32
,
24
,
12
);
text
=
new
Text(group, SWT.BORDER);
text.setBounds(
40
,
29
,
80
,
15
);
final
Label label_1
=
new
Label(group, SWT.NONE);
label_1.setText(
"
性别
"
);
label_1.setBounds(
172
,
32
,
30
,
12
);
text_1
=
new
Text(group, SWT.BORDER);
text_1.setBounds(
208
,
29
,
80
,
15
);
final
TableViewer tableViewer
=
new
TableViewer(composite, SWT.BORDER);
table
=
tableViewer.getTable();
table.setLinesVisible(
true
);
table.setHeaderVisible(
true
);
table.setBounds(
0
,
68
,
494
,
270
);
initializeToolBar();
}
@Override
public
void
setFocus()
{
//
TODO Auto-generated method stub
}
private
void
initializeToolBar()
{
IToolBarManager toolBarManager
=
getViewSite().getActionBars().getToolBarManager();
}
package
hellorcp.intro;
import
org.eclipse.ui.IPageLayout;
import
org.eclipse.ui.IPerspectiveFactory;
public
class
Perspective
implements
IPerspectiveFactory
{
public
void
createInitialLayout(IPageLayout layout)
{
String editorArea
=
layout.getEditorArea();
layout.addView(
"
hellorcp.navigationview
"
, IPageLayout.LEFT,
0.15f
, editorArea);
layout.addView(
"
hellorcp.detailview
"
, IPageLayout.LEFT, 1f, editorArea);
}