`

Eclipse RCP中使用Swing组件

 
阅读更多

原文地址:http://twaver.servasoft.com/?p=2918

 

Swing与SWT是基于Java的两种完全不同的视图控件技术,前者是jdk自带,后者是Eclipse的衍生物,两者都有广大的用户群,而结合使用的案例也很多,笔者使用Swing多年,最近有幸作了个Eclipse RCP与Swing结合的例子,期间发现了些难点,特作本文了以皮毛之见。

相关概念

Swing
Swing为JDK自带,是正统的java界面控件,历史悠久,设计优雅,是java开发界面组件的第一选择,但Swing组件更新缓慢,几年来都没有太大变化,加上官方NetBeans臃肿缓慢的表现,让依赖本地库、界面native的SWT得以发展壮大。

SWT
SWT是eclipse项目的衍生物,全称是“Standard Widget Toolkit”,SWT需要依赖本地库,界面风格与本地程序协调一致,借助eclipse的优秀表现,SWT给人以运行流畅,界面漂亮的印象,赢得了不少用户的青睐。

Eclipse RCP
Eclipse RCP是一个用于创建和部署富客户端应用的平台,它包含Equinox(一个基于OSGi标准的组件框架),用于构建丰富的具有本地GUI的桌面应用程序,并提供通过服务端升级桌面程序的完整体系。

如何创建Eclipse RCP项目

安装插件
首先我们需要安装Eclipse RCP Plug-in Developer Resources插件,当然你也可以使用Eclipse IDE for Java EE Developer,这个版本的Eclipse包含的插件比较全

创建一个Plug-in Project,添加两个View到透视图
新建一个Plug-in Project,向导中,Rich Client Application选项选择yes,后面有模版可供选择,不熟悉Eclipse RCP的可以选个模版练手。
Eclipse RCP中每个ViewPart表示一个可插拔的视图,而Perspective类的作用是对View作布局,这里我们创建两个view:NavigationView,View,左边导航树(借用了RCP自带的mail模版),右边主面板用来嵌入Swing组件,初步为如下效果:

如何在Eclipse RCP中嵌入Swing组件

Eclipse RCP详细使用说明可以参考文档:http://www.vogella.de/articles/EclipseRCP/article.html,本文的主要目的是介绍Swing组件的嵌入,下面我们在右边的View中加入一个Swing面板。

使用SWT_AWT桥实现Swing组件的嵌入,使用SWT_AWT.new_Frame(composite)实现SWT组件中嵌入AWT的Frame对象,而AWT的Frame中就可以添加Swing组件了,参考下面的代码

 

public class View extends ViewPart {
	public static final String ID = "HelloRCP.view";
	private JPanel swingPanel;

	public void createPartControl(Composite parent) {
		Composite composite = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND);
		final Frame frame = SWT_AWT.new_Frame(composite);
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				swingPanel = new JPanel();
				JButton button = new JButton("Swing Button");
				swingPanel.add(button);
				frame.add(swingPanel);
			}
		});
	}
	public void setFocus() {}
}

 运行效果:

 

Eclipse UI线程与Swing事件派发线程

上面的代码中我们留意到,创建Swing的JPanel我们是在Swing的事件派发线程(EDT)中调用的,EDT的作用是保证Swing线程的安全,任何Swing界面相关的操作都需要在EDT中执行,与Swing的这一设计类似,SWT也有一个UI线程,任何SWT界面相关的操作都必需在这个UI线程中调用,下面我们对按钮添加点击监听,实现视图名称的修改,注意代码需要在getDisplay().asyncExec中调用

 

public void createPartControl(Composite parent) {
	Composite composite = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND);
	final Frame frame = SWT_AWT.new_Frame(composite);
	SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			swingPanel = new JPanel();
			swingPanel.setDoubleBuffered(true);
			JButton button = new JButton("Click and change view name");
			button.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent e) {
					getSite().getShell().getDisplay().asyncExec(new Runnable() {
						public void run() {
							View.this.setPartName("New Swing View");
						}
					});
				}
			});
			swingPanel.add(button);
			frame.add(swingPanel);
		}
	});
}

 

 

 

 

嵌入TWaver Demo

嵌入了Swing组件,可惜不够好看,直接把TWaver Demo放进来如何,于是拷贝TWaver Demo的源码,引用twaver.jar到build path,在createPartControl(Composite parent)中创建一个demo.MainPane,放到右边的面板中:

 

public void createPartControl(Composite parent) {
	Composite composite = new Composite(parent, SWT.EMBEDDED | SWT.NO_BACKGROUND);
	final Frame frame = SWT_AWT.new_Frame(composite);
	SwingUtilities.invokeLater(new Runnable() {
		public void run() {
			Demo.init();
			MainPane mainPanel = new MainPane();
			mainPanel.setDoubleBuffered(true);
			frame.add(mainPanel);
			...
	});
}

 Eclipse RCP工程中如何引入第三方jar

 

这里还有件重要的事要做,Eclipse RCP中使用第三方jar需要在Runtime Classpath中引入这个jar,可以按下图中的设置

 

Eclipse View之间如何交互

Eclipse RCP框架中,每个view都是独立的,在一个view中没法直接得到另一个view的实例,要实现view之间的交互需要一些特殊手段,如通过selection监听器监听其他视图的selection事件,详细使用可参考http://www.cnblogs.com/zephyr/archive/2008/05/30/1210477.html

本例中实现的是点击左边SWT的导航树,同步选中右边TWaver的对应的树节点,要实现这样的功能,要求右边的视图能监听左边视图的变化事件,首先我们在NavigationView中注册导航树为事件提供者:
注意下面的这行代码:this.getSite().setSelectionProvider(treeViewer);其作用是向系统提供一个消息源,这样当这个树选中变化时,别的视图就可以监听到这些事件

 

public void createPartControl(Composite parent) {
		treeViewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL | SWT.BORDER);
		...
		this.getSite().setSelectionProvider(treeViewer);
		...
	}

 然后在View视图中监听上面的消息源

 

public void createPartControl(Composite parent) {
	...
	this.getSite().getPage().addSelectionListener(NavigationView.ID, new ISelectionListener() {
		public void selectionChanged(IWorkbenchPart arg0, ISelection arg1) {
			...
		}
	});
	...
}
 

 

 

通过以上两步就实现了视图View监听视图NavigationView中变化事件的功能,同理,如果需要在NavigationView视图中监听View视图中的事件,则需要注册View为事件源,然后在NavigationView中监听该事件,有了这种消息传递机制,我们就可以实现各个视图间的通信了,而具体同步的代码我这里就不多说了。

补充一个小技术点

Windows操作系统下,SWT中的Swing组件可能出现闪烁的问题,可以通过调用下面的函数,设置为true,以避免该问题

1 JComponent#public void setDoubleBuffered(boolean aFlag)

最终运行结果

 

 

 

分享到:
评论

相关推荐

    Eclipse RCP详细教程

    此外,Eclipse RCP还支持多种UI组件和技术,如Swing和SWT,这使得开发者可以根据具体需求选择最适合的技术栈。 ##### 1.2. Eclipse RCP 建设风格——插件、扩展和扩展点 Eclipse RCP的核心是插件、扩展和扩展点的...

    Eclipse RCP应用系统开发

    Eclipse RCP的特性包括组件化开发、动态插件加载、跨平台兼容性以及对Java Swing和 SWT图形库的支持,这些都使得开发者能更灵活地构建和维护应用系统。 总的来说,Eclipse RCP是现代软件开发中的一个强大工具,尤其...

    Eclipse RCP教程

    - **添加更新站点**:通过Eclipse的市场功能添加新的更新站点,以便获取最新的Eclipse RCP组件。 #### 四、创建第一个RCP应用 ##### 4.1 创建RCP应用 - **新建项目**:在Eclipse中选择“File”>“New”>“Other”>...

    Eclipse RCP 图书

    压缩包中的文件名“EclipseRCP开发桌面程序.mht”和“RCP程序设计.pdf”可能包含更具体的技术细节,如实例教程、最佳实践或深入的技术讨论。通过阅读这些文档,开发者可以进一步深化对Eclipse RCP的理解,提升开发...

    Eclipse RCP开发指南

    Eclipse SDK下载包含了多个组件,这些组件构成了Eclipse RCP的基础,具体包括: - SWT (2.5MB):Swing Widget Toolkit,用于构建用户界面。 - RCP (5.8MB):Eclipse RCP的核心部分。 - Eclipse Platform (28MB):...

    eclipse-RCP-3.1.1-win32.zip

    在本文中,我们将深入探讨Eclipse RCP、JFace和SWT,以及如何使用这个压缩包进行开发工作。 Eclipse RCP允许开发者使用面向服务的架构来创建功能丰富的桌面应用程序。它基于Eclipse IDE,提供了丰富的插件系统和可...

    Eclipse+RCP框架分析和应用研究.pdf

    《Eclipse RCP框架分析和应用研究》一文深入探讨了Eclipse RCP(Rich Client Platform)框架在Java桌面应用程序开发中的应用与优势。Eclipse RCP作为一种先进的开发框架,为Java开发者提供了构建高性能、高可扩展性...

    如何在SWT中使用AWT、SWING组件

    2. **通过例子学习EclipseRCP开发.pdf**:Eclipse RCP(Rich Client Platform)是基于SWT构建复杂桌面应用的框架,这本书可能深入讲解了如何在RCP项目中集成AWT和SWING组件。 3. **Eclipse插件RCP中文入门教程.pdf**...

    Eclipse RCP 简介

    Pages通常在多页编辑器中使用,展示不同的内容;Perspectives定义了工作区的不同布局,方便用户切换不同的工作环境;而Editors则用于显示和编辑数据,比如文本编辑器。 SWT(Standard Widget Toolkit)是Eclipse ...

    RCP经典,rcp eclipse

    5. **命令与 Handler**:Eclipse RCP使用命令(Command)和处理器(Handler)机制来处理用户操作。命令定义了操作行为,而处理器实现了命令的具体逻辑。 6. **透视图(Perspective)**:透视图是一种组织和显示工作...

    Addison Wesley - Eclipse Rich Client Platform Designing Coding And Packaging Java Applications

    书籍将解释如何在Eclipse RCP中实现MVC,并展示如何使用Declarative Services和Blueprints等服务来解耦组件。 4. **事件驱动编程**:Eclipse RCP中的事件处理是通过监听器和事件传递机制实现的。书籍会阐述如何有效...

    eclipse插件开发: rcp/swt相关资料

    在Eclipse插件开发中,RCP和SWT结合使用,使得开发者能够利用Eclipse的强大功能和SWT的高效性能来创建功能丰富的桌面应用程序。以下是一些关键知识点: 1. **插件体系结构**:Eclipse插件基于OSGi框架,每个插件都...

    eclipse 开发桌面程序

    2. **创建项目**:在Eclipse中创建一个新的SWT或Swing项目。 3. **设计界面**:利用WindowBuilder的拖拽功能,在设计面板中布局所需的组件,并设置其属性。这些操作将自动生成对应的Java代码。 4. **编写逻辑**...

    eclipse-rcp-2022-06-R-linux-gtk-x86_64.tar

    该压缩包 "eclipse-rcp-2022-06-R-linux-x86_64" 中包含的主要文件是 "eclipse-rcp-2022-06-R-linux-x86_64",这可能是一个可执行的Eclipse IDE实例,用于在Linux系统上支持RCP和RAP的开发。为了运行这个IDE,你需要...

    在RCP中显示JFreeChart报表

    在RCP应用中,我们通常使用SWT(Standard Widget Toolkit),它是Eclipse GUI的基础。可以创建一个`ChartComposite`对象,它是SWT和JFreeChart之间的桥梁,然后将`JFreeChart`实例传递给它,将其添加到视图的`...

    Eclipse Rich Client Platform Designing, Coding, and Packaging.chm

    6. **模型驱动开发**:探讨MDA(Model Driven Architecture)在RCP中的应用,以及如何使用EMF(Eclipse Modeling Framework)来定义和操作业务模型。 7. **事件机制与通信**:介绍事件传递和监听器机制,以及服务...

Global site tag (gtag.js) - Google Analytics