nighty

折腾的年华
posts - 37, comments - 143, trackbacks - 0, articles - 0

posted @ 2008-01-28 09:48 寒武纪 阅读(2773) | 评论 (4)编辑 收藏

    通常情况下,用户应该在简单字段(例如文本字段或组合框)中提供文本信息。虽然用来填充这些字段的应用程序代码通常比用来填充复杂窗口小部件(例如表或树)的代码简单得多,但这些“简单”字段通常会给用户带来更多负担。用户必须确定哪些字段需要内容、某个字段是否包含有效内容以及应该选择哪些选项。JFace 的字段辅助支持提供了一些类来帮助指导用户完成输入任务。
    org.eclipse.jface.fieldassist包提供了二种方式的辅助。带修饰字段支持允许您提供图像修饰,以便向用户提供有关特定字段状态的提示。内容建议支持允许您提供内容辅助弹出窗口,以便向用户提供内容选项。
    下面了解一下关于内容建议部分。
    一般的IDE工具都有内容建议的功能,比如很常见的Java编辑器,输入“.”之后就会激活一个窗口,从里面可以选择方法或字段,这个功能可以快速高效地完成代码,而且可以减少很多输入错误。jface的fieldassist提供了对这个功能的支持。
    我们做一个demo,先看一下这个demo的效果。
     
     当按下Alt + '/'的时候,弹出内容辅助的窗口。从中可以选择相应的建议,进行快速输入。
    下面是相应的代码,非常简单。
    

sShell = new Shell();
        sShell.setText(
"Shell");
        GridLayout gridLayout 
= new GridLayout(1false);
        sShell.setLayout(gridLayout);
        sShell.setSize(
new Point(300200));
        
        
final Text t = new Text(sShell, SWT.BORDER | SWT.MULTI);
        t.setLayoutData(
new GridData(GridData.FILL_BOTH));
        autoActivationCharacters 
= new char[] '#''(' };
        
try {
            keyStroke 
= KeyStroke.getInstance("Alt+/");
        }
 catch (ParseException e1) {
            e1.printStackTrace();
        }

        ContentProposalAdapter adapter 
= new ContentProposalAdapter(t,
                
new TextContentAdapter(), new SimpleContentProposalProvider(
                        
new String[] "建议1""建议2""建议3" }), keyStroke,
                autoActivationCharacters);

    按照帮助文档的描述如下:为了在用户从弹出窗口中选择建议时获取和设置控件内容,必须向适配器提供 IControlContentAdapter 实例,该实例可以检索和设置特定类型控件的内容。对于文本字段来说,可以使用 TextContentAdapter 类。但是,也可以灵活地实现 IControlContentAdapter,以便将内容建议适配器与任何其他类型的控件配合使用。
    关键是定义ContentProposalAdapter类,它有几个必须的参数,第一个是需要进行内容辅助的控件,第二个是IControlContentAdapter 实例,jface默认提供了二个实现:ComboContentAdapter, TextContentAdapter。按照上面的建议,如果你需要更加高级的功能,那么得实现IControlContentAdapter第四个是IContentProposalProvider的实例,这是提供内容辅助窗口中的内容提供器的接口,jface只实现了一个SimpleContentProposalProvider,这是最简单的只提供文本内容的内容提供器。同样的,你可以继承IContentProposalProvider来实现更高级的功能。
    keyStroke是定义按下什么键时激活该提示。autoActivationCharacters是定义当输入遇到什么符号时会激活提示的字符数组。
   按照帮助文档的说明,可以在任意控件上安装 ContentProposalAdapter 以提供此行为。需要什么样的高级功能,就必须具体实践一下以上几个接口的实现。一般的编辑器都会配合SoucreViewer来提供这些功能。

posted @ 2007-11-02 17:28 寒武纪 阅读(2380) | 评论 (5)编辑 收藏

     摘要:     每当做开发的时候,你有可能在一次调试程序的过程中打开很多个编辑器,或是对Eclipse默认的视图布局不满意,手工作了一些调整。如果在工作的过程你因为有事离开或是不小心把Eclipse关掉了,不用担心,在你下次打开的时候,Eclipse仍然会为您记住上次的工作场景。下面是一个例子场景:        ...  阅读全文

posted @ 2007-10-30 15:51 寒武纪 阅读(8663) | 评论 (0)编辑 收藏

    开发基于Eclipse开的RCP软件可以直接加入Eclipse的帮助系统,使您的产品更加完善。Eclipse帮助系统提供的良好组织模式以及基于lucene的全文搜索功能。在Eclipse的网站上有一篇文章专门介绍如何为Mail示例RCP添加帮助系统的,但是写的不完全,按照里面的说明添加后无法正常地显示帮助框架。网上有少部分文章也提及这个主题,但是都没有说明白。
    经过一翻摸索,最后终于折腾出来,在这里记录下面,与大家分享。如果你做过RCP产品,下面这些内容应该很熟悉。
    1. 添加帮助的菜单。
       在ApplicationActionBarAdvisor类中加入帮助菜单项。代码片断如下:
      
//帮助
    private IWorkbenchAction helpAction;

    
/**
     * 创建操作
     
*/
    
protected void makeActions(IWorkbenchWindow window) {
        ....
 
        
/* 帮助 */
        .....
        helpAction 
= ActionFactory.HELP_CONTENTS.create(window);
        register(helpAction);
        .....

     }

    
/**
     * 填充主菜单
     
*/
    
protected void fillMenuBar(IMenuManager menuBar) {
        
/* 主菜单栏 */
        IMenuManager mainMenu 
= getActionBarConfigurer().getMenuManager();
        
        MenuManager helpMenu 
= new MenuManager("帮助(&H)", IWorkbenchActionConstants.M_HELP);
        helpMenu.add(introAction);
        helpMenu.add(helpAction);
        ....
        
        
        mainMenu.add(helpMenu);
    }
   2.  添加相关的依赖项。
       打开plugin.xml,转到"依赖项"的tab页,点击"添加"按钮,需要加入下面的这些依赖项:
1. org.apache.lucene
2.
org.eclipse.help.appserver
3.
org.eclipse.help.base
4.
org.eclipse.help.ui
5.
org.eclipse.help.webapp
6.
org.eclipse.tomcat
7.org.eclipse.ui.forms
   
    3. 添加org.eclipse.help.toc扩展点
       这个非常容易,转到"扩展"tab页,点击“添加”按钮。网上或是相关的书籍有很多关于添加help内容的介绍,为了节省篇幅,这里直接添加一个扩展向导来完成。选择"扩展向导"-->"帮助内容",确定后可以看到“所有扩展”的列表中多了一个org.eclipse.help.toc扩展,这里可能需要修改一下,生成的toc.xml和testToc.xml里面的label属性标签不能是乱码,不然帮助框架会读不出,到时候显示不出帮助的组织结构。
       结构如下:
      
<extension
         
point="org.eclipse.help.toc">
      
<toc file="toc.xml"/>
      
<toc
            
file="testToc.xml"
            primary
="true"/>
   
</extension>
   
    4. 部署产品配置
       为您的RCP添加一个产品配置,打开产品配置编辑器(xxx.product),转到"配置"tab页,点击“添加”,加入你的插件,然后点击“添加必需的插件”,这样在“插件和段”列表会看到你的插件以及你的RCP要完整启动的所有必需相关插件。在这里你应该看到你在plugin.xml中依赖的那七个help相关的插件,以及一些以nl1结尾的插件,这些是语言插件。保存,转到“概述”tab页,点击"启动产品"。然后打开“帮助--> 帮助内容”,就可能看到你的帮助系统了。
    到此一个完整的帮助系统就完成了。下面是一个截图:
   

posted @ 2007-10-25 10:30 寒武纪 阅读(8924) | 评论 (3)编辑 收藏

   最近为一个项目的服务器的做一个界面的时候,为了能把原来在后台打印出来的相关信息重定向到GUI界面的时候,费了一些心思。都是以前在实现的时候大多数信息的打印和测试时使用的都是System.out和System.err之类,图个方便,没有使用log功能。当然这是个不好的习惯。
   刚开始的时候用Swing做了一个面板,采用JTextPane组件作为打印信息的容器。可能是太久没有用Swing了,在测试的时候这个东西的水平滑动块老是随着信息的显示自动地滑向最后的地方,而且打印信息看起来很凌乱。后来就换用SWT,把打印的信息容器换用Text组件,把样式定义为SWT.MULT | SWT.V_SCROLL | SWT.WRAP ,让它可以自动换行。
   查一下JDK的API文档,System类提供了可以重定向的方法setOut(PrintStream out)、setErr(PrintStream err)、setIn(InputStream in)。在此我们只需求使用setOut和setErr就够了,这二个方法都要传入一个PrintStream类型的参数,只要在调用打印信息的前面调用这二个方法重设输出流和错误流就可以达到我们的目的。那么我们继承PrintStream类,并把要显示信息的组件作为参数传入到这个自定义的打印流类中。

 1public class MyPrintStream extends PrintStream {
 2
 3    private Text text;
 4    
 5    public MyPrintStream(OutputStream out, Text text) {
 6        super(out);
 7        this.text = text;
 8    }

 9
10    /**
11     * 在这里重截,所有的打印方法都要调用的方法
12     */

13    public void write(byte[] buf, int off, int len) {
14        final String message = new String(buf, off, len);
15        
16        /* SWT非界面线程访问组件的方式 */
17        Display.getDefault().syncExec(new Thread(){
18            public void run(){
19                /* 在这里把信息添加到组件中 */
20                text.append(message);
21            }

22        }
);
23    }

24    
25}

把组件作为参数传入到这个打印流中,并重写父类的write(byte[] buf, int off, int len)方法,把写出的信息添加到组件上,注意到重载了带OutputStream的构造方法。
   这里有二点必须注意,确保组件在调用打印信息添加前是已经被正确创建的,另外必须注册不同GUI组件对线程的访问形式,像上面的SWT就对界面的访问有严格的规定。
   完成了PrintStream后,下面是如何使用,在我们启动界面后,使用下面的方式:
1MyPrintStream mps = new MyPrintStream(System.out, text);
2        System.setOut(mps);
3        System.setErr(mps);

,这样就可以把原来程序里的所有System.out和System.err信息转移到你的GUI界面上。

posted @ 2007-08-27 19:07 寒武纪 阅读(1474) | 评论 (2)编辑 收藏

     摘要:   阅读全文

posted @ 2007-08-15 09:55 寒武纪 阅读(6218) | 评论 (0)编辑 收藏

仅列出标题
共4页: 上一页 1 2 3 4