网站首页 新闻首页 网页设计图形动画软件编程网站开发办公软件操作系统数据库网络技术认证考试范文资料黑客攻防 书籍教程 进入论坛

实现RCP自身的控制台

http://www.diybl.com/ 2007-12-3  网络 点击:  [ 评论 ]
文章搜索:    【点击打包该文章】

在做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)方法中加入如下:layout.addView(IConsoleConstants.ID_CONSOLE_VIEW, IPageLayout.BOTTOM,0.70f, layout.getEditorArea());

最后,自定义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)
                       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);

 }

经常遇到的错误:

1.  在显示视图时遇到如下错误:

java.lang.NoClassDefFoundError: org/eclipse/ui/console/IConsoleFactory
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClass(Unknown Source)
……

首先,应该检查在上图位置的地方是否加入需要的插件,即: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的状态栏即可。

自定义控制台,向其输出RCP中的一些实时信息:

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的压缩程序
下一篇文章:JNI技术——JNI调用VB的DLL

文章评论

请您留言