- 浏览: 1056900 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
nieanan:
感谢,很有帮助。
eclipse 改变JAVA_HOME路径 -
Orange_killer:
写的什么东西,文不对题
Hibernate Search大数据量手动建立索引 -
xiaoasha:
org.eclipse.equinox.servlet.api ...
《OSGI实战》遇到的问题 -
powertech:
写的挺细,有用!
SyntaxError: Non-ASCII character Python、Unicode和中文 -
huang_yong:
public class XMLUtil {
pri ...
XStream 去除生成的XML节点的class="list"
一、解决基本问题:
在做 RCP 项目的时候经常会遇到一个问题,就是要将一些控制信息输出到 RCP 自身的控制台,那么我们就可以扩展 Eclipse 扩展点 org.eclipse.ui.console.consoleFactories ,来实现我们自己的控制台,解决方法如下:
首先 ,在 plugin.xml 中定义扩展点:
plugin.xml:
<extension
point="org.eclipse.ui.console.consoleFactories">
<consoleFactory
class="com.hnjchina.intro.ConsoleFactory"
label="
控制台
"/>
</extension>
其次 ,在 perspective 中加入 console View ,作为控制信息的控制台( console ):
在 Perspective .java 类中的 Public void createInitialLayout(IPageLayout layout) 方法中加入如下:
ConsoleFactory cf = new ConsoleFactory();
layout.addView(IConsoleConstants.ID_CONSOLE_VIEW, IPageLayout.BOTTOM,0.70f, layout.getEditorArea());
cf.openConsole();
最后 ,自定义 ConsoleFactory 类,主要实现 showConsole() 方法,然后在要输出信息的地方定义 printer 变量如下:
private MessageConsoleStream printer =ConsoleFactory.console.newMessageStream();
自定义的 ConsoleFactory 类具体代码如下:
package com.essp.eseai.maptool.perspective.views; import java.io.IOException; import java.io.PrintStream; import org.eclipse.ui.console.ConsolePlugin; import org.eclipse.ui.console.IConsole; import org.eclipse.ui.console.IConsoleFactory; import org.eclipse.ui.console.IConsoleManager; import org.eclipse.ui.console.MessageConsole; import org.eclipse.ui.console.MessageConsoleStream; /** *//** * 描述:样式显示控制台视图 * */ public class ConsoleViewPart implements IConsoleFactory ...{ private static MessageConsole console = new MessageConsole("样式显示窗口", null); /** *//** * 描述:打开控制台 * */ public void openConsole() { showConsole(); } /** *//** * 描述:显示控制台 * */ public static void showConsole() { try ...{ if (console != null) { //得到默认控制台管理器 IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); //得到所有的控制台实例 IConsole[] existing = manager.getConsoles(); boolean exists = false; //新创建的MessageConsole实例不存在就加入到控制台管理器,并显示出来 for (int i = 0; i < existing.length; i++) { if (console == existing[i]) exists = true; } if(!exists)...{ System.out.println("aaaaaaaa"); manager.addConsoles(new IConsole[] { console }); } manager.showConsoleView(console); MessageConsoleStream stream = console.newMessageStream(); stream.write("测试!"); System.setOut(new PrintStream(stream)); } } catch (IOException e) { e.printStackTrace(); } } /** *//** * 描述:关闭控制台 * */ public static void closeConsole() { IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager(); if (console != null) { manager.removeConsoles(new IConsole[] { console }); } } public static MessageConsole getConsole() ...{ return console; } }
二、总结:
重用
Console
有两种办法:
1
、作为组件来重用:
//getConsole
就是
new MessageConsole("", null);
mainConsole = ConsoleFactory.getConsole();
mainTab = new TabItem(tabFolder, SWT.NONE);
TextConsoleViewer tcv = new TextConsoleViewer(tabFolder, mainConsole);
mainTab.setText(" 主线程 ");
mainTab.setControl(tcv.getControl());
MessageConsoleStream printer = mainConsole.newMessageStream();
printer.setColor(Display.getCurrent() .getSystemColor(SWT.COLOR_BLACK));
ConsoleFactory.java :
public static MessageConsole getConsole() {
return new MessageConsole("", null);
}
2
、作为
view
重用:
<extension
id="Hapcent.ConsoleFactory"
name="Console Factory"
point="org.eclipse.ui.console.consoleFactories">
<consoleFactory
class="edu.fudan.hapcent.UI.ConsoleFactory"
icon="icons/sample2.gif"
label="Hapcent.consoleFactory"/>
</extension>
ConsoleFactory.java
:
关键是一个方法:
public void openConsole() {
IConsoleManager manager = ConsolePlugin.getDefault().getConsoleManager();
IConsole[] existing = manager.getConsoles();
boolean exists = false;
for (int i = 0; i < existing.length; i++) {
if (console
== existing)
exists = true;
}
if (!exists) {
manager.addConsoles(new IConsole[] { console
});
}
manager.showConsoleView(console
);
}
三、经常遇到的错误:
在显示视图时遇到如下错误:
java.lang.NoClassDefFoundError: org/eclipse/ui/console/IConsoleFactory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
……
<!-- [endif]-->
首先,应该检查在上图位置的地方是否加入需要的插件,即: org.eclipse.ui.console
2 .在 Dependences 里面已经加入了运行需要的包,但是将 RCP 作为一个 eclipse 项目来运行时还是报错,而在项目的 .product 文件里先配置好运行需要用到的包,然后用 launch the product 选项 test 项目,可以运行:
这是运行配置的问题,作为项目运行的时候是使用的以前的配置,而那个配置里面没有添加这个包。同样道理,如果以后你再添加了其他的包而没有在你现在 .product 文件中添加的话,它同样不会自动添加,所以也会出问题。所以这是应该看看你运行时的这个地方有没有勾上 org.eclipse.ui.console ,如下图:
另外,在项目的 .product 文件里有一个 Synchronize, 点击这里可以同步你的运行配置
3 .当显示 Eclipse 自身的控制台后,状态栏的内容没有了:
分析:调用
IStatusLineManager.setMessage(String message)
会将信息写入
Eclipse
状态栏的共享区域,其他的插件例如
Console
也可以对这个区域进行修改,这样当第一次选中
Console
时,原有状态栏中的信息就会被清除。
解决:解决的方法是自己实现一个
IContributionItem
,并在
fill(Composite parent)
方法中定义其布局,然后在
ActionBarAdvisor.fillStatusLine(IStatusLineManager statusLine)
中调用
statusLine.add(IContributionItem item)
将其加入
Eclipse
的状态栏即可。
4
.
如何默认就是自己实现的控制台,通常情况下默认的控制台不是自己扩展的那个,而非得在视图里切换一下才行,还有就是能否把控制台视图里的那些ACTION不显示出来? 四、自定义控制台,向其输出
RCP
中的一些实时信息:
解决:
调用openConsole() 就可以默认显示你自己扩展的控制台了
public class SystemInfoView extends ViewPart ...{ public static final String ID = "com.winscad.view.SystemInfoView"; String strGetRespone = ""; Text textSysInfo; /** *//** * Create contents of the view part * @param parent */ @Override public void createPartControl(Composite parent) ...{ final Composite container = new Composite(parent, SWT.NONE); //设置面板布局 container.setLayout(new FillLayout()); //创建带有水平和垂直滚动条的文本框 textSysInfo = new Text(container,SWT.BORDER|SWT.V_SCROLL|SWT.H_SCROLL); //设置文本框的滚动条一直处于最下端 textSysInfo.setTopIndex(0); final Timer timer = new Timer(true); //设置每隔1秒去读一次业务返回的响应数据,并循环显示(刷新) timer.scheduleAtFixedRate(new TimerTask()...{ public void run() ...{ Display.getDefault().asyncExec(new Runnable()...{ public void run() ...{ } }); }}, 6*1000, 1*1000); createActions(); initializeToolBar(); initializeMenu(); } /** *//** * Create the actions */ private void createActions() ...{ // Create the actions } /** *//** * Initialize the toolbar */ private void initializeToolBar() ...{ IToolBarManager toolbarManager = getViewSite().getActionBars().getToolBarManager(); Action deleteAction = new Action()...{ public void run()...{ textSysInfo.setText(""); } }; deleteAction.setText(Message.getString("ParameterView.Clear"));//清空 deleteAction.setToolTipText(Message.getString("ParameterView.ClearSystem"));//清空系统信息 deleteAction.setImageDescriptor(PlatformUI.getWorkbench().getSharedImages(). getImageDescriptor(ISharedImages.IMG_TOOL_DELETE)); toolbarManager.add(deleteAction); //为ToolBarManager添加自定义控件 ComboContribution combo = new ComboContribution("Combo.contribution"); toolbarManager.add(combo); toolbarManager.add(new ComboContribution2()); } //自定义控件 class ComboContribution extends ControlContribution...{ public ComboContribution(String id)...{ super(id); } @Override protected Control createControl(Composite parent)...{ Combo combo = new Combo(parent, SWT.READ_ONLY); combo.setItems(new String[]...{ "First", "Secend", "Third" }); combo.addSelectionListener(new SelectionListener()...{ public void widgetDefaultSelected(SelectionEvent e) ...{ // TODO Auto-generated method stub } public void widgetSelected(SelectionEvent e) ...{ // TODO Auto-generated method stub textSysInfo.append("View工具栏测试!"); } }); return combo; } } //自定义控件 class ComboContribution2 extends ContributionItem...{ private ToolItem toolitem; private Combo fFindCombo; private Button upFindbutton; private Button downFindbutton; private Button allFindbutton; public ComboContribution2() ...{ super(); } protected Control createControl(Composite parent) ...{ Composite composite = new Composite(parent, SWT.NONE); //查询框 fFindCombo = new Combo(composite,SWT.NONE); fFindCombo.setLocation(0, 2); fFindCombo.setSize(130,20); System.out.println(" fFindCombo == " + fFindCombo.getBounds()); //向上查 upFindbutton = new Button(composite, SWT.NONE); upFindbutton.setLocation(135, 2); upFindbutton.setSize(30,20); upFindbutton.setText("上查"); upFindbutton.addSelectionListener(new SelectionListener()...{ public void widgetDefaultSelected(SelectionEvent e) ...{ // TODO 自动生成方法存根 } public void widgetSelected(SelectionEvent e) ...{ fFindCombo.add(fFindCombo.getText()); } }); System.out.println(" upFindbutton == " + upFindbutton.getBounds()); //向下查 downFindbutton = new Button(composite, SWT.NONE); downFindbutton.setLocation(170, 2); downFindbutton.setSize(30,20); downFindbutton.setText("下查"); //全部查询 allFindbutton = new Button(composite, SWT.NONE); allFindbutton.setLocation(205, 2); allFindbutton.setSize(30,20); allFindbutton.setText("全部"); toolitem.setWidth(240); return composite; } public void fill(ToolBar parent, int index) ...{ toolitem = new ToolItem(parent, SWT.SEPARATOR, index); Control control = createControl(parent); toolitem.setControl(control); } } /** *//** * Initialize the menu */ private void initializeMenu() ...{ IMenuManager menuManager = getViewSite().getActionBars() .getMenuManager(); } @Override public void setFocus() ...{ // Set the focus } public String getStrGetRespone() ...{ return strGetRespone; } public void setStrGetRespone(String strGetRespone) ...{ this.strGetRespone = strGetRespone; } }
发表评论
-
java.lang.ClassNotFoundException: com.mysql.jdbc.Driver
2010-05-28 16:00 5578引用 在rcp的路径添加了mysql驱 动,并添加之cla ... -
getConfigurationElementsFor 无法获得扩展点的信息
2009-11-06 13:33 1808做项目的时候RCP程序在eclipse调试环境下面运行正常,但 ... -
equinox使用代码加载了新的组件后如何清除缓存
2009-10-13 13:54 1567equinox使用代码加载了新的组件后,每次执行程序新的组件都 ... -
从外部启动Equinox
2009-10-12 10:07 2104前面,我们都是通过Eclipse启动我们的Bun ... -
ServiceTracker 的作用
2009-10-10 14:50 3981如果您的服务消费者需要了解某一接口下的服务对象何时注册、何时取 ... -
方便管理plugin或rcp的icons
2009-09-20 22:26 1060每个UI程序都离不开图片,一般的Eclipse插件,在一个类中 ... -
RCP MessageConsole设置显示的最大行数
2009-09-17 14:57 1701网上讲如何将MessageConsole加入RCP的文章有很多 ... -
Jface 进度条
2009-09-16 16:23 1189someButton.addSelectionListener ... -
将Eclipse的console插件加入到自己的RCP应用程序中
2009-09-16 15:13 3823打开plugins.xml, 在Dependencies项中 ... -
eclipse调试equinox bundle时只能启动6个bundle的问题
2009-09-10 10:18 1978最近写了一个equinox的OSGi工程,里面有十几个bund ... -
解决JFace Dialog中ScrollComposite无法滚动
2009-09-08 22:32 2658今天写了一个Jface的dialog,作为配置界面,其中有个配 ... -
SWT实现弹出日历控件
2009-09-08 12:54 3227实现像网页上的那种用户单击一个Text框然后框下面出现一个日历 ... -
RCP中自定义“退出”按钮
2009-08-06 16:53 2118你可以在View.java的createPartControl ... -
在RCP中实现系统托盘功能
2009-08-06 16:37 1865在RCP中实现系统托盘功能 在RCP中加入系统托盘功能,类似 ... -
《OSGI实战》遇到的问题
2009-07-01 10:43 3390《OSGI实战 》中的eclipse可能比较老,练习其中的用 ... -
OSGi概念入门
2009-06-07 22:50 2228OSGi概念入门 OSGi概念入门 OS ...
相关推荐
20. **专题五**:EQUINOX P2 方式实现RCP自动更新 - **概述**:P2是Eclipse的更新和包管理系统。 - **示例**:通过P2实现RCP应用的自动更新。 - **Feature概念**:了解Feature在更新中的作用。 - **配置Product*...
开发者可以编写自己的插件来实现特定的功能。 2. **工作台(Workbench)**:工作台是Eclipse RCP中的核心管理器,负责协调和管理所有视图、编辑器和透视图。它是用户界面的组织结构,允许用户在多个视图和编辑器...
1、PJSECURE 是一个 C 风格的 Win32 动态链接库,利用它可以实现软件产品的网络拷贝注册功能。2、通过调用 RCP 函数 ...3、源代码中包含 PJSECURE 的定义和实现以及一个测试该 DLL 的控制台程序。4、支持 Unicode ,
RAP(RCP for the Web)是一种基于Eclipse RCP的Web应用程序开发框架。它利用HTML、JavaScript等Web技术为客户端提供用户界面,并通过AJAX与服务器端进行交互。RAP支持Eclipse插件开发的所有功能,使得开发者可以...
- **视图(View)**:视图提供特定的功能,例如包浏览器、问题视图、控制台视图等,它们可以被组织到工作台的不同区域,帮助开发者查看和操作项目。 - **编辑器(Editor)**:编辑器用于编写和编辑代码,根据所选...
- Linux支持多用户同时登录,通过虚拟控制台实现这一功能。用户可以使用`Alt + F1`到`Alt + F6`之间的组合键切换不同的虚拟控制台,从而实现多用户或多任务的并行操作。 **2. shutdown** - **作用**: `shutdown` ...
Shell不仅是一种命令语言解释器,还拥有自己的一套内置命令集,可以处理各种复杂的命令和脚本。此外,Shell还能被其他应用程序调用执行特定任务。用户通过在Shell提示符下输入命令来与操作系统进行交互,这些命令...