blogjava-凯发k8网页登录

blogjava-凯发k8网页登录http://www.blogjava.net/dreamstone/category/24602.html开发出高质量的系统zh-cnmon, 14 sep 2009 20:13:03 gmtmon, 14 sep 2009 20:13:03 gmt60做了个osworkflow的designer工具,模仿jbpm的样式。大家试用用http://www.blogjava.net/dreamstone/archive/2009/09/14/295047.htmldreamstonedreamstonemon, 14 sep 2009 10:01:00 gmthttp://www.blogjava.net/dreamstone/archive/2009/09/14/295047.htmlhttp://www.blogjava.net/dreamstone/comments/295047.htmlhttp://www.blogjava.net/dreamstone/archive/2009/09/14/295047.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/295047.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/295047.html http://www.blogjava.net/files/dreamstone/eclipse1.part1.rar

http://www.blogjava.net/files/dreamstone/eclipse1.part3.rar
http://www.blogjava.net/files/dreamstone/eclipse1.part4.rar



dreamstone 2009-09-14 18:01 发表评论
]]>
eclipse 插件开发中如何实现刷新和重编译http://www.blogjava.net/dreamstone/archive/2007/08/28/140578.htmldreamstonedreamstonetue, 28 aug 2007 08:32:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/28/140578.htmlhttp://www.blogjava.net/dreamstone/comments/140578.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/28/140578.html#feedback2http://www.blogjava.net/dreamstone/comments/commentrss/140578.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/140578.html代码的插件中,有时需要刷新一下文件夹
或者重新编译一下.那如何实现这两个操作呢。
一、实现刷新
1、一个关键的接口是org.eclipse.core.resources.iresource
调用这个接口的refreshlocal方法即可。例如refreshlocal(iresource.depth_infinite, null)
2、到底有哪些类实现了这个接口呢?
来看一下继承结构
首先继承自iresource的接口有icontainer、ifolder、iproject、iworkspaceroot、ifile一共5个
加上iresource 6个,凡是实现这些接口的都可以。
3、接口的继承结构
接口                                 extends
iresource                          无 
icontainer                     iresource
ifile                                iresource
ifolder                           icontainer
iproject                          icontainer
iworkspaceroot         icontainer

4、类的继承结构

类                            
extends                        implements
resource                     无                             iresource
container                resource                     icontainer
file                           resource                     ifile
folder                      container                    ifolder
project                     container                    iproject
workspaceroot    container                    iworkspaceroot

二、实现重编译(也就是clean)
clean all:
resourcesplugin.getworkspace().build(incrementalprojectbuilder.clean_build,
monitor);
 
clean one project
((iproject) selection[i]).build(incrementalprojectbuilder.clean_build, 
new
subprogressmonitor(monitor, 
1));
感谢 的帮忙


dreamstone 2007-08-28 16:32
]]>
swt/jface进度条http://www.blogjava.net/dreamstone/archive/2007/08/10/135728.htmldreamstonedreamstonefri, 10 aug 2007 01:59:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/10/135728.htmlhttp://www.blogjava.net/dreamstone/comments/135728.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/10/135728.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/135728.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/135728.html1,普通的进度条
import java.lang.reflect.invocationtargetexception;

import org.eclipse.core.runtime.iprogressmonitor;
import org.eclipse.jface.dialogs.progressmonitordialog;
import org.eclipse.jface.operation.irunnablewithprogress;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;


public class testprogress {
    
static boolean stopflg = false;
    
/**
     * launch the application
     * 
@param args
     
*/

    
public static void main(string[] args) throws exception{
        
final display display = display.getdefault();
        
final shell shell = new shell();
        shell.setsize(
500375);
        shell.settext(
"swt application");
        
        
//
        irunnablewithprogress runnable = new irunnablewithprogress(){
            
public void run(iprogressmonitor monitor) throws invocationtargetexception, interruptedexception {
                monitor.begintask(
"generate"30);
                
for(int i=0;i<100;i){
                    
if(monitor.iscanceled()){
                        
return;
                    }

                    monitor.worked(
1);
                    thread.sleep(
50);
                }

                
                monitor.done();
            }

        }
;
        
new progressmonitordialog(shell).run(truetrue, runnable);
        shell.open();
        shell.layout();
        
while (!shell.isdisposed()) {
            
if (!display.readanddispatch())
                display.sleep();
        }

    }


}

2,反复循环的进度条
import java.lang.reflect.invocationtargetexception;

import org.eclipse.core.runtime.iprogressmonitor;
import org.eclipse.jface.dialogs.progressmonitordialog;
import org.eclipse.jface.operation.irunnablewithprogress;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;


public class testprogress {
    
static boolean stopflg = false;
    
/**
     * launch the application
     * 
@param args
     
*/

    
public static void main(string[] args) throws exception{
        
final display display = display.getdefault();
        
final shell shell = new shell();
        shell.setsize(
500375);
        shell.settext(
"swt application");
        
        
//
        irunnablewithprogress runnable = new irunnablewithprogress(){
            
public void run(iprogressmonitor monitor) throws invocationtargetexception, interruptedexception {
                monitor.begintask(
"generate"30);
                
int i=0;
                
while(true){
                    
if(stopflg){
                        
break;
                    }

                    i
;
                    
if(i==30){
                        i
=0;
                        monitor.begintask(
"generate"30);
                    }

                    monitor.worked(
1);
                    thread.sleep(
100);
                }

                monitor.done();
            }

        }
;
        
new progressmonitordialog(shell).run(truetrue, runnable);
        shell.open();
        shell.layout();
        
while (!shell.isdisposed()) {
            
if (!display.readanddispatch())
                display.sleep();
        }

    }


}

3,rcp中后台任务的进度条
使用job建立后台任务,只需要设置job.setuser(true)进度条就出现了,和上边一样,进度条需要自己来控制进度。如果做一个cool的进度条,就看你如何让进度条显示出实际的任务进程。

dreamstone 2007-08-10 09:59
]]>
给自定义dialog加入保留对话框值的功能http://www.blogjava.net/dreamstone/archive/2007/08/09/134565.htmldreamstonedreamstonethu, 09 aug 2007 10:13:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/09/134565.htmlhttp://www.blogjava.net/dreamstone/comments/134565.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/09/134565.html#feedback1http://www.blogjava.net/dreamstone/comments/commentrss/134565.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134565.html在上例"自定义dialog"的代码上加入三个函数:
public void savestate(){
        
if (text.gettext() == null || text.gettext().equals("")){
            
return ;
        }

        idialogsettings topsettings 
= gettopsettings();
        idialogsettings settings 
=  topsettings.getsection("testdialog");
        
if(settings == null)settings = topsettings.addnewsection("testdialog");
        settings.put(
"value", text.gettext());
        
try{
            topsettings.save(
"content/system.xml");
        }
catch(ioexception e){
            system.out.println(e.getmessage());
        }

    }

    
public void restorestate(){
        idialogsettings topsettings 
= gettopsettings();
        idialogsettings settings 
=  topsettings.getsection("testdialog");
        
if(settings == nullreturn;
        
if (text.gettext() == null || text.gettext().equals("")){
            text.settext(settings.get(
"value"));
        }

    }

    
public idialogsettings gettopsettings(){
        idialogsettings topsettings 
= new dialogsettings("system");
        
try{
            topsettings.load(
"content/system.xml");
        }
catch(ioexception e){
            system.out.println(e.getmessage());
        }

        
return topsettings;
    }

然后在覆写的buttonpressed函数中调用save
protected void buttonpressed(int button){
        savestate();
    }
在createdialogarea函数中加入取出数据
protected control createdialogarea(composite parent) {
        composite container 
= (composite) super.createdialogarea(parent);
        container.setlayout(
new rowlayout());
        text 
= new text(container, swt.border);
        text.setlayoutdata(
new rowdata(100,-1));
        
//加入这一句
        if (text.gettext() == null || text.gettext().equals("")){
            restorestate();
        }

        
return container;
    }
最后,记得建立需要的文件,在当前workspace下建立文件夹content,然后在文件夹下建立system.xml文件。当然你也可以利用程序来实现。
运行一下看看吧,是不是记住了上次填入的内容.
source下载:


dreamstone 2007-08-09 18:13
]]>
swt/jface 自定义 dialoghttp://www.blogjava.net/dreamstone/archive/2007/08/09/134560.htmldreamstonedreamstonethu, 09 aug 2007 09:42:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/09/134560.htmlhttp://www.blogjava.net/dreamstone/comments/134560.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/09/134560.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/134560.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134560.html一、写一个类,继承自dialog
import org.eclipse.jface.dialogs.dialog;
import org.eclipse.swt.widgets.shell;

public class testdialog extends dialog {

    
public testdialog(shell parentshell) {
        
super(parentshell);
    }

}

好了,写好了,如何运行呢?
再写一个类:
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;

public class test {
    
public static void main(string[] args) {
        shell shell 
= new shell();
        testdialog td 
= new testdialog(shell);
        td.setblockonopen(
true);
        td.open();
        display.getcurrent().dispose();
    }

}

好了运行一下看到效果了吧,带有两个button.
二、看到上边的代码是否会想到别的呢?为什么要再写一个类来运行dialog,不能在内部写个main方法吗?
我们来试一下:
方法一:参考jface hello world的的写法:
import org.eclipse.jface.dialogs.dialog;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;

public class testdialog extends dialog {

    
public testdialog(shell parentshell) {
        
super(parentshell);
    }

    
public static void main(string[] args) {
        testdialog td 
= new testdialog(new shell());
        td.setblockonopen(
true);
        td.open();
        display.getcurrent().dispose();
    }

}


运行一下看看什么效果,提示找不到main方法。且打印出如下exception
java.lang.exceptionininitializererror
caused by: java.lang.nullpointerexception
 at org.eclipse.jface.resource.jfaceresources.getresources(jfaceresources.java:184)
 at org.eclipse.jface.resource.jfaceresources.getimageregistry(jfaceresources.java:310)
 at org.eclipse.jface.dialogs.dialog.(dialog.java:211)
exception in thread "main"
为什么呢?我们是有main方法的,跟进exception去看看吧。
发现问题出现在dialog类的这段代码上:
static {
        imageregistry reg 
= jfaceresources.getimageregistry();
        reg.put(dlg_img_message_info, imagedescriptor.createfromfile(
                dialog.
class"images/message_info.gif")); //$non-nls-1$
        reg.put(dlg_img_message_warning, imagedescriptor.createfromfile(
                dialog.
class"images/message_warning.gif")); //$non-nls-1$
        reg.put(dlg_img_message_error, imagedescriptor.createfromfile(
                dialog.
class"images/message_error.gif")); //$non-nls-1$
    }

原来在静态代码块上出现了exception,造成在运行main函数之前就退出了。所以才说没有main函数。
我们知道classload在加载一个类的时候,对于静态代码块会逐行执行,按照出现的先后顺序。同时父类的静态代码块一定比子类的先执行。因为
在load子类之前会先load父类。这就是为什么hello world中不会出现问题,这里会出现问题的原因。因为dialog比applicationwindow多了这段静态代码。

继续追下去为什么这段代码会出现空指针异常呢,原来这段代码依赖于new shell()必须先运行。而我们的new shell()写在main方法里边,肯定是在加载类完成后才能运行的。所以在类内部直接写个main方法是不行的。只能单独写个类来调用。
方法二:
单独写个类如下:

import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;

public class test {
    
public static void main(string[] args) {
        testdialog td 
= new testdialog(new shell());
        td.setblockonopen(
true);
        td.open();
        display.getcurrent().dispose();
    }

}

依然是不行的,报同样的错误,为什么?仔细看一下,我们把new shell()写在构造函数的参数里,其实范了和刚才同样的错误。所以单独提出new shell(),写在构造函数之前。就得到了文章开始的test类。平时我们使用的时候为什么不出这个问题呢?因为我们平时使用的时候dialog从里不是单独存在的,在之前shell早被构造过了。反而是demo更容易出这个问题。
好了,上边只是个小插曲,继续我们的自定义dialog.
三、去掉两个按钮
虽然dialog天生带的两个按钮不错,但我们有的时候并不想要这两个按钮,怎么办,如何去掉它?
简单,只要我们覆盖父类的createbuttonsforbuttonbar这个方法就可以了,覆写这个方法,里边什么也不写
protected void createbuttonsforbuttonbar(composite parent) {
    }

看一下按钮消失了。
四、加入右上角的最大化和关闭
覆写父类的这个方法:
protected int getshellstyle(){
        
return super.getshellstyle()|swt.resize|swt.max;
    }

五、改变dialog的大小
覆写这个方法:
protected point getinitialsize(){
        
return new point(300,400);//300是宽400是高
    }
六、加入自己的控件
覆写createdialogarea方法
protected control createdialogarea(composite parent) {
        composite container 
= (composite) super.createdialogarea(parent);
        container.setlayout(
new rowlayout());
        text 
= new text(container, swt.border);
        text.setlayoutdata(
new rowdata(100,-1));
        
return container;
    }

这里使用了rowlayout
七、加入自己的按钮
覆写initializebounds
protected void initializebounds(){
        composite comp 
= (composite)getbuttonbar();
        
super.createbutton(comp, idialogconstants.ok_id, "完成"true);
    }
好了这里自定义dialog完成了,然后根据你的需要再dialog中添加更负载的控件,更多的按钮。最后目的当然是从dialog取道数值。
八、带提示框的dialog
使用方法和前边相同,不同的是不是继承自dialog而是继承自titleareadialog,然后在createdialogarea中加入两行
settitle("标题");
setmessage(
"提示信息")
//setmessage可以加上图片,加入的办法是setmessage("提示信息",imessageprovider.warning);如果想加入其他的图片,调用相应的常量。

source下载:

dreamstone 2007-08-09 17:42
]]>
swt/jface中提供的dialoghttp://www.blogjava.net/dreamstone/archive/2007/08/09/134536.htmldreamstonedreamstonethu, 09 aug 2007 01:39:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/09/134536.htmlhttp://www.blogjava.net/dreamstone/comments/134536.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/09/134536.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/134536.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134536.html下一篇文章再继续将如何自定义dialog
一、messagedialog
1,messagedialog的用法很简单,只需要一句话.

messagedialog.openinfomation(shell,title,message);
messagedialog.openconfirm(shell,title,message);
messagedialog.openquestion(shell,title,message);
messagedialog.openerror(shell,title,message);

2,这四个的不同之处有三点:
                              提示的图标、                  显示的按钮、                     返回值
openinfomation       类似i的图标                     一个确定                             void
openconfirm           问号图标                          确定和取消                        boolean
openquestion          问号图标                         是和否                                 boolean
openerror               一个x的图标                   确定                                     void

最后说一下,messagedialog的大小不能根据内容自动调整,对于少量提示信息的时候显得大了些。
3,inputdialog输入的dialog
使用方法:

inputdialog inputdialog = new inputdialog(shell,"标题","提示信息","默认值",null);
if(inputdialog.open() == inputdialog.ok){
    string value 
= dialog.getvalue();
}
注意最后一个参数是"验证器",如果想验证数据可以提供一个验证器,并在这里使用。验证其的写法:
public class myvalidator implements iinputvalidaor{
    
public string isvalid(string newtext){
        
float value = 0;
        
try{
            value 
= float.valueof(newtext).floatvalue();
        }
catch(numberformatexception e){
            
return "错误:请输入数值";
        }

        
if(value>0 && value<100){
            
return null;
        }
else{
            
return "错误:请输入大于0,小于100的数";
        }

    }

}

然后改写定义语句为
inputdialog inputdialog = new inputdialog(shell,"标题","提示信息","默认值",new myvalidator());
二、上边说了messagedialog不能自动调整大小,那什么能自动调整大小呢?答案是messagebox.
同样继承自dialog.
1,使用方法:messagebox的使用方法稍微复杂,需要3句
messagebox mb = new messagebox(shell);
mb.setmessage(
"提示信息");
mb.open();
2,messagebox同样可以控制图标和按钮数
是通过new的时候加入式样来实现的,例如
messagebox mb = new messagebox(shell,swt._icon_quest|swt.yes|swt.no);

做过swt开发的人对这种格式应该不陌生,到处都是。

图标的种类:
swt.icon_error
swt.icon_information
swt.icon_question
swt.icon_warning

按钮的组合:
swt.ok
swt.ok|swt.cancel
swt.yes|swt.no
swt.yes|swt.no|swt.cancel
swt.retry|swt.cancel
swt.abort|swt.retry|swt.ignore
仔细看一下就是我们平时经常看到的各种对话框。
三、颜色选择对话框
不多说,使用方法几乎在swt中遍地都是的用法。

colordialog dialog = new colordialog(shell);
rgb rgb 
= dialog.open();
if(rgb != null){
    color color 
= new color(shell.getdisplay(),rgb);
}

注意color使用过后要dispose();
四、字体选择对话框
有了上边的一些经验其实在有eclipse这种编辑器的帮助下猜着就可以写了
fontdialog dialog = new fontdialog(shell);
fontdata fontdata 
= dialog.open();
if (fontdate != null){
    font font 
= new font(shell.getdisplay(),fontdata);
}

同样在结束后font.dispose();
五、打印对话框,同上的使用方法,同上的需要dispose
printdialog dialog = new printdialog(shell);
printdata printdata 
= dialog.open();
if (printdate != null){
    printer printer 
= new printer(printerdata);
}

六、文件选择对话框:同上
1,实现方法
filedialog dialog = new filedialog(shell,swt.open);
dialog.setfilterpath(
"c:\windows");//设置初始路径
string filename = dialog.open();//返回的全路径(路径 文件名)
2,如果想选择多个文件,加上swt.multi
filedialog dialog = new filedialog(shell,swt.open|swt.multi);
string filename 
= dialog.open();//返回最后一个选择文件的全路径
string[] filenames = dialog.getfilenames();//返回所有选择的文件名,不包括路径
string path = dialog.getfilterpath();返回选择的路径,这个和filenames配合可以得到所有的文件的全路径
3,加入filter
filedialog dialog = new filedialog(shell,swt.open|swt.nulti);
dialog.setfilternames(
new string[]{"可执行文件(*.exe),"excel(*.xls),"所有文件""});
dialog.setfilterextensions(new string[]{"*.exe","*.xls","*.*"});
//接受方法同2中的写法,不同就是加入了过滤器。
4,保存对话框
保存对话框并不提供保存功能,这个需要自己实现,它只提供界面,并得到用户选择的目录和输入的文件名
filedialog dialog = new filedialog(shell,swt.save);
string filename 
= dialog.open();



dreamstone 2007-08-09 09:39
]]>
jface的hello world引出的问题http://www.blogjava.net/dreamstone/archive/2007/08/07/134544.htmldreamstonedreamstonetue, 07 aug 2007 01:10:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/07/134544.htmlhttp://www.blogjava.net/dreamstone/comments/134544.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/07/134544.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/134544.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134544.html阅读全文

dreamstone 2007-08-07 09:10
]]>
swt/jface listviewer的实现http://www.blogjava.net/dreamstone/archive/2007/08/06/134533.htmldreamstonedreamstonemon, 06 aug 2007 06:26:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/06/134533.htmlhttp://www.blogjava.net/dreamstone/comments/134533.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/06/134533.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/134533.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134533.html一、代码,这个实现不同于前边是分开实现(都是public 的类),这里给出的是内部类的实现方式。
import java.util.arraylist;
import java.util.list;

import org.eclipse.jface.viewers.istructuredcontentprovider;
import org.eclipse.jface.viewers.labelprovider;
import org.eclipse.jface.viewers.listviewer;
import org.eclipse.jface.viewers.viewer;
import org.eclipse.swt.swt;
import org.eclipse.swt.graphics.image;
import org.eclipse.swt.layout.filllayout;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;


public class testlistviewer {

    
static class listlabelprovider extends labelprovider {
        
public string gettext(object element) {
            country country 
= (country)element;
            
return country.getname();
        }

        
public image getimage(object element) {
            
return null;
        }

    }

    
static class contentprovider implements istructuredcontentprovider {
        
public object[] getelements(object inputelement) {
            
if(inputelement instanceof list){
                list list 
= (list)inputelement;
                
return list.toarray();
            }

            
return new object[0];
        }

        
public void dispose() {
        }

        
public void inputchanged(viewer viewer, object oldinput, object newinput) {
        }

    }

    
static class country {
        
private string name;

        
public country(){
        }

        
public country(string name){
            
this.name = name;
        }

        
public string getname() {
            
return name;
        }


        
public void setname(string name) {
            
this.name = name;
        }

        
public static list getcountrylist(){
            list list 
= new arraylist();
            list.add(
new country("中国"));
            list.add(
new country("美国"));
            list.add(
new country("日本"));
            
return list;
        }

        
    }

    
private static org.eclipse.swt.widgets.list list;
    
/**
     * launch the application
     * 
@param args
     
*/

    
public static void main(string[] args) {
        
final display display = display.getdefault();
        
final shell shell = new shell();
        shell.setsize(
500375);
        shell.settext(
"swt application");
        
//
        
        shell.open();

        
final listviewer listviewer = new listviewer(shell, swt.border);
        listviewer.setlabelprovider(
new listlabelprovider());
        listviewer.setcontentprovider(
new contentprovider());
        listviewer.setinput(
new object());
        list 
= listviewer.getlist();
        list.setbounds(
12263100100);
        
        listviewer.setcontentprovider(
new contentprovider());
        listviewer.setlabelprovider(
new listlabelprovider());
        listviewer.setinput(country.getcountrylist());
        
//可以直接添加
        listviewer.add(new country("英国"));
        shell.setlayout(
new filllayout());
        shell.layout();
        
while (!shell.isdisposed()) {
            
if (!display.readanddispatch())
                display.sleep();
        }

    }


}


二、注意代码的注释部分,可以直接添加和移除。

dreamstone 2007-08-06 14:26
]]>
swt/jface treeviewer的使用http://www.blogjava.net/dreamstone/archive/2007/08/05/134512.htmldreamstonedreamstonesun, 05 aug 2007 07:20:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/05/134512.htmlhttp://www.blogjava.net/dreamstone/comments/134512.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/05/134512.html#feedback2http://www.blogjava.net/dreamstone/comments/commentrss/134512.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134512.html阅读全文

dreamstone 2007-08-05 15:20
]]>
swt/jface tableviewer入门教程四(加入filter ,改变行的颜色)http://www.blogjava.net/dreamstone/archive/2007/08/05/134499.htmldreamstonedreamstonesun, 05 aug 2007 05:33:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/05/134499.htmlhttp://www.blogjava.net/dreamstone/comments/134499.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/05/134499.html#feedback1http://www.blogjava.net/dreamstone/comments/commentrss/134499.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134499.html如果我们想根据某一列来过滤记录,如何实现呢?很简单,定义一个过滤器filter。这里只演示定义一个过滤器的情况。
现实中你可以定义多个灵活的过滤器,通过替换过滤器来实现各种各样的过滤。
一、过滤器代码:
import org.eclipse.jface.viewers.viewer;
import org.eclipse.jface.viewers.viewerfilter;

public class myfilter extends viewerfilter {
    
public boolean select(viewer viewer, object parentelement, object element) {
        people p 
= (people) element;
        
return p.getname().startswith("张1");
    }

}
然后在testtableviewer的shell.open前加入这个过滤器
tableviewer.addfilter(new myfilter());
好了,看一下效果
二、如果我们想凸显某一条记录,想改变一下它的颜色,如果实现呢,简单,只要几句话就可以了。
color color = display.getdefault().getsystemcolor(swt.color_red);
table.getitems()[table.getitemcount()
-1].setbackground(color);
table.redraw();

三、这里提一下,使用tabeviewer.setusehashlookup(true)可以在tableviewer内部为数据记录和tableitem之间的映射创建一个hash表,这样可以加快tableitem的和记录间的查找速度,注意,这条语句必须在setinput之前加入才有效。
好了,到此tableviewer的基本的东西介绍的差不多了
source下载:
四:在现实的开发中,我们更多的是喜欢把一些简单的类用匿名类或者内部类的方式来实现。像之前例子中每个都单独一个类的情况并不多。
下边是和前边的source效果等同的source,不过是使用了匿名类和内部类。



dreamstone 2007-08-05 13:33
]]>
swt/jface tableviewer入门教程三(加入在表格上直接编辑数据)http://www.blogjava.net/dreamstone/archive/2007/08/05/134498.htmldreamstonedreamstonesun, 05 aug 2007 05:21:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/05/134498.htmlhttp://www.blogjava.net/dreamstone/comments/134498.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/05/134498.html#feedback4http://www.blogjava.net/dreamstone/comments/commentrss/134498.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134498.html阅读全文

dreamstone 2007-08-05 13:21
]]>
swt/jface tableviewer入门教程二(让tableviewer按照列排序)http://www.blogjava.net/dreamstone/archive/2007/08/05/134496.htmldreamstonedreamstonesun, 05 aug 2007 05:05:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/05/134496.htmlhttp://www.blogjava.net/dreamstone/comments/134496.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/05/134496.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/134496.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134496.html阅读全文

dreamstone 2007-08-05 13:05
]]>
swt/jface tableviewer入门教程一(显示tableviewer)http://www.blogjava.net/dreamstone/archive/2007/08/05/134495.htmldreamstonedreamstonesun, 05 aug 2007 04:48:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/05/134495.htmlhttp://www.blogjava.net/dreamstone/comments/134495.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/05/134495.html#feedback4http://www.blogjava.net/dreamstone/comments/commentrss/134495.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134495.html阅读全文

dreamstone 2007-08-05 12:48 发表评论
]]>
swt入门 --常用组件的使用http://www.blogjava.net/dreamstone/archive/2007/08/02/134074.htmldreamstonedreamstonethu, 02 aug 2007 09:53:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/02/134074.htmlhttp://www.blogjava.net/dreamstone/comments/134074.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/02/134074.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/134074.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/134074.html阅读全文

dreamstone 2007-08-02 17:53
]]>
学习gef-whole-upload初期易犯的两个错误http://www.blogjava.net/dreamstone/archive/2007/08/02/133955.htmldreamstonedreamstonethu, 02 aug 2007 03:18:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/02/133955.htmlhttp://www.blogjava.net/dreamstone/comments/133955.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/02/133955.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/133955.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/133955.html按照gef-whole-upload来学习,过程中会遇到这么几个错误:
错误一:
java.lang.runtimeexception: application "gef.tutroial.step.application" could not be found in the registry. the applications available are: .
解决方法:
核对plugin.xml中的第一段中的路径,名字是否都是正确的。是否都对应自己的包名
          id="application"
         point="org.eclipse.core.runtime.applications">
     
                        class="gef.tutorial.step.rcp.application">
        
     

  
如果因为错误包名更改后还是报这个错误。关掉eclipse重新启动

错误二:
按照教程的操作,结果出现错误
org.eclipse.ui.partinitexception: unable to open editor, unknown editor id:
检查你的plugin.xml中的这一段
         point="org.eclipse.ui.editors">
                  class="gef.tutorial.step.ui.diagrameditor"
            default="false"
            icon="icons/alt_about.gif"
            id="gef.tutorial.step.ui.diagrameditor"
            name="diagram editor"/>
  
   是否有icon="",我开始以为没有icon没什么所以没配置,结果一直出错,配上就好了。感觉这个做的真
  让人郁闷,还必须有icon



dreamstone 2007-08-02 11:18
]]>
gef-whole-upload 代码 (更全的部分)http://www.blogjava.net/dreamstone/archive/2007/08/02/133952.htmldreamstonedreamstonethu, 02 aug 2007 03:11:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/08/02/133952.htmlhttp://www.blogjava.net/dreamstone/comments/133952.htmlhttp://www.blogjava.net/dreamstone/archive/2007/08/02/133952.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/133952.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/133952.html另外网上看到过一个source,那个到划线部分就没有了,我这个基本是全文的。
另外说明一下:因为版本的原因,部分功能可能用不了,原教程是针对eclipse的低版本的。但主要功能是可以的。我是在eclipse 3.2.2上开发的。正在考虑如何把对应eclipse3.3如果有结果同样会继续发出来。
source下载地址:

dreamstone 2007-08-02 11:11
]]>
eclipse3.3的一些新的特性http://www.blogjava.net/dreamstone/archive/2007/07/27/132865.htmldreamstonedreamstonefri, 27 jul 2007 10:08:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/07/27/132865.htmlhttp://www.blogjava.net/dreamstone/comments/132865.htmlhttp://www.blogjava.net/dreamstone/archive/2007/07/27/132865.html#feedback3http://www.blogjava.net/dreamstone/comments/commentrss/132865.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/132865.html1,ctrl shift o 在代码中有错误的时候也能执行了
2,显示个数   显示tab数变多了
3,最大最小化效果好了,而且多了直接能点开一些窗口的按钮。注意边上
4,执行速度变快了,启动速度,关闭速度都快了很多
5,导入工程的时候选定一个文件夹,自动寻找子文件夹中的所有工程,并且过滤掉已经导入的工程。
6,新建工程的时候自动建处src和bin,虽然3.2的时候也可以自己手动配置实现,但3.3时默认实现,更人性化一
些。
7,据说占用内存少了
用了一天看到就这些,欢迎补充.

dreamstone 2007-07-27 18:08
]]>
eclipse rcp 开发实例 (源码下载)http://www.blogjava.net/dreamstone/archive/2007/05/18/118399.htmldreamstonedreamstonefri, 18 may 2007 08:05:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/05/18/118399.htmlhttp://www.blogjava.net/dreamstone/comments/118399.htmlhttp://www.blogjava.net/dreamstone/archive/2007/05/18/118399.html#feedback37http://www.blogjava.net/dreamstone/comments/commentrss/118399.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/118399.html当时想找一个可以用来学习的简单的源代码真难,有的都是复杂的。
这里提供一个简单的工程。设计初学者接触的各种问题。有时通一件事情使用了两种方式来实现。
使用了treeview  ,tableview 
tableview的排序
加入了javamail
使用了jobs后台进程
加入了log4j
国际化
设置了部署工程
右键、菜单、双击等事件



dreamstone 2007-05-18 16:05
]]>
学习eclipse插件开发资源全收集(plugin)http://www.blogjava.net/dreamstone/archive/2007/05/08/116016.htmldreamstonedreamstonetue, 08 may 2007 10:07:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/05/08/116016.htmlhttp://www.blogjava.net/dreamstone/comments/116016.htmlhttp://www.blogjava.net/dreamstone/archive/2007/05/08/116016.html#feedback3http://www.blogjava.net/dreamstone/comments/commentrss/116016.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/116016.html阅读全文

dreamstone 2007-05-08 18:07 发表评论
]]>
通过eclipse插件bytecode outline方便了解java字节码http://www.blogjava.net/dreamstone/archive/2007/02/22/100358.htmldreamstonedreamstonethu, 22 feb 2007 10:44:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/02/22/100358.htmlhttp://www.blogjava.net/dreamstone/comments/100358.htmlhttp://www.blogjava.net/dreamstone/archive/2007/02/22/100358.html#feedback2http://www.blogjava.net/dreamstone/comments/commentrss/100358.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/100358.html阅读全文

dreamstone 2007-02-22 18:44
]]>
eclipse中最常用的热键http://www.blogjava.net/dreamstone/archive/2007/02/08/98706.htmldreamstonedreamstonethu, 08 feb 2007 03:41:00 gmthttp://www.blogjava.net/dreamstone/archive/2007/02/08/98706.htmlhttp://www.blogjava.net/dreamstone/comments/98706.htmlhttp://www.blogjava.net/dreamstone/archive/2007/02/08/98706.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/98706.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/98706.htmleclipse中最常用的热键:

1,ctrl d     删除选中的几行
2,alt 上下箭头    移动选中的代码块
3,alt 左右箭头   回退 前进
4,alt shift 上下箭头   复制选中的代码块
5,sysout ctrl space     生成system.out.println();
6,main ctrl space     生成最简单的main函数
7,ctrl shift x   切换成大写
8,ctrl shift y   切换成小写
9,ctrl z    取消undo
10,ctrl y    redo
11,ctrl s    保存
12,tab     块缩进
13,shift tab   反向块缩进
14,ctrl shif f   格式化代码
15,ctrl o    显示成员方法 ,成员对象
16,ctrl shift i   调试的时候显示对象的值
17,ctrl m    全屏
18,ctrl n    新建
19,ctrl l    进入到第n行
20,ctrl /    注释打开代码
21,ctrl shift /   块注释
22,ctrl shift \   块注释取消
23,ctrl 1    纠正代码
24,f3     显示继承树
25,ctrl f    查找替换
26,ctrl h    更大范围的查找替换
27,f5     step into
28,f6     step over
29,f7     step return
30,f8     resume



dreamstone 2007-02-08 11:41
]]>
eclipse rcp 系列八 中更改状态条的信息http://www.blogjava.net/dreamstone/archive/2006/11/07/79623.htmldreamstonedreamstonetue, 07 nov 2006 07:35:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/07/79623.htmlhttp://www.blogjava.net/dreamstone/comments/79623.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/07/79623.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/79623.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79623.htmlprivate void showstatusmessage(string msg) {
  workbenchwindow workbenchwindow = (workbenchwindow) platformui
    .getworkbench().getactiveworkbenchwindow();
   workbenchwindow.setstatus(msg);
 }

dreamstone 2006-11-07 15:35
]]>
eclipse rcp系列 七 多线程http://www.blogjava.net/dreamstone/archive/2006/11/07/79621.htmldreamstonedreamstonetue, 07 nov 2006 07:32:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/07/79621.htmlhttp://www.blogjava.net/dreamstone/comments/79621.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/07/79621.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/79621.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79621.htmljob job = new job("job1") {
 protected istatus run(iprogressmonitor monitor) {
  //-----你自定义的东西
  job1 job1 = new job1();
  job1.run();
  //-----------------
  return status.ok_status;
 }
};
job.setpriority(job.short);
job.schedule();  //start as soon as possible

dreamstone 2006-11-07 15:32
]]>
eclipse rcp系列 六 treeviewhttp://www.blogjava.net/dreamstone/archive/2006/11/07/79619.htmldreamstonedreamstonetue, 07 nov 2006 07:23:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/07/79619.htmlhttp://www.blogjava.net/dreamstone/comments/79619.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/07/79619.html#feedback1http://www.blogjava.net/dreamstone/comments/commentrss/79619.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79619.htmltreeview的使用和tableview差不多,不同的是contentprovider和labelprovider的实现接口不同了。下边是个例子,看一下相信你就,明白了
 class kindlabelprovider extends labelprovider {
  public string gettext(object obj) {
   if (obj instanceof kind) {
    return obj.tostring();
   }
   return null;
  }

  public image getimage(object obj) {
   // string imagekey = isharedimages.img_obj_element;
   if (obj instanceof kind) {
    string imagekey = isharedimages.img_obj_folder;
    platformui.getworkbench().getsharedimages().getimage(imagekey);
   }
   return null;
  }
 }

 class kindcontentprovider implements istructuredcontentprovider,
   itreecontentprovider {

  public object[] getelements(object parent) {
   if(parent instanceof kind){
    return getchildren(parent);
   }
   return null;
  }

  public object getparent(object child) {
   if (child instanceof node) {
    return ((node) child).getparent();
   }
   return null;
  }

  public object[] getchildren(object parent) {
   if (parent instanceof kind) {
    arraylist children = ((kind) parent).getchildren();
    
    return children.toarray(new node[children.size()]);
    
   }
   return new object[0];
  }

  public boolean haschildren(object parent) {
   if (parent instanceof kind)
    return ((kind) parent).haschildren();
   return false;
  }

  public void dispose() {
   // todo auto-generated method stub

  }

  public void inputchanged(viewer viewer, object oldinput, object newinput) {
   // todo auto-generated method stub

  }
 }



dreamstone 2006-11-07 15:23
]]>
eclipse rcp系列 5 开发过程中遇到的小问题合集http://www.blogjava.net/dreamstone/archive/2006/11/07/79618.htmldreamstonedreamstonetue, 07 nov 2006 07:20:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/07/79618.htmlhttp://www.blogjava.net/dreamstone/comments/79618.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/07/79618.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/79618.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79618.html1,使用第三方控件,在rcp开发中使用第三方控件(lib)的方式和一般的开发不太一样,方式如下链接

2,使用属性文件,对於属性文件的读取,也稍有不同,使用方法(转自)

1。使用java.util.properties类的load()方法 
示例: 
inputstream in = lnew bufferedinputstream(new fileinputstream(name)); 
properties p = new properties(); 
p.load(in); 

2。使用java.util.resourcebundle类的getbundle()方法 
示例:
resourcebundle rb = resourcebundle.getbundle(name, locale.getdefault()); 

3。使用java.util.propertyresourcebundle类的构造函数 
示例: 
inputstream in = new bufferedinputstream(new fileinputstream(name)); 
resourcebundle rb = new propertyresourcebundle(in); 

4。使用class变量的getresourceasstream()方法 
示例: 
inputstream in = jproperties.class.getresourceasstream(name); 
properties p = new properties(); 
p.load(in); 

5。使用class.getclassloader()所得到的java.lang.classloader的getresourceasstream()方法 
示例: 
inputstream in = jproperties.class.getclassloader().getresourceasstream(name); 
properties p = new properties(); 
p.load(in); 

6。使用java.lang.classloader类的getsystemresourceasstream()静态方法 
示例: 
inputstream in = classloader.getsystemresourceasstream(name); 
properties p = new properties(); 
p.load(in); 

补充 

servlet中可以使用javax.servlet.servletcontext的getresourceasstream()方法 
示例:
inputstream in = context.getresourceasstream(path); 
properties p = new properties(); 
p.load(in); 

3,国际化,在国际化界面的同时,记得国际化plug-in,国际话的方法 不同于程序中的message.getstring()方法,是使用的%,这样
             class="com.niis.myprice.views.kindview"
            id="com.niis.myprice.views.kindview"
            name="%plugin.kindmanager"/>
然後对应各种语言建立一个plugin.properties,记着发布的时候不要忘记加入这些配制文件。



dreamstone 2006-11-07 15:20
]]>
eclipse rcp系列 四 弹出提示窗口http://www.blogjava.net/dreamstone/archive/2006/11/06/79400.htmldreamstonedreamstonemon, 06 nov 2006 06:43:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/06/79400.htmlhttp://www.blogjava.net/dreamstone/comments/79400.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/06/79400.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/79400.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79400.htmlmessagedialog
只有一个确定
messagedialog.openinformation(shell, "title", "message");
有是/否
messagedialog.openconfirm(shell, "title","message");
有是/否/取消
messagedialog dialog = new messagedialog(shell, "title", null, "message",
  messagedialog.question, new string[] {idialogconstants.yes_label,
  idialogconstants.no_label,idialogconstants.cancel_label }, 0);
dialog.open();
还可以加入更多的选择项,只需要在数组中加入更多的内容
那如何取得点击了哪个按钮呢,两种方法
直接int result = dialog.open();
或者int result = dialog.getreturncode();
返回的result的值就是被选中按钮在数组中的index


dreamstone 2006-11-06 14:43
]]>
eclipse rcp系列三 进一步了解viewerhttp://www.blogjava.net/dreamstone/archive/2006/11/06/79398.htmldreamstonedreamstonemon, 06 nov 2006 06:32:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/06/79398.htmlhttp://www.blogjava.net/dreamstone/comments/79398.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/06/79398.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/79398.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79398.html好在二的基础上,继续,这个时候我们须要增加一个viewer.在这里我须要说一下,在eclipse的开发中用到的很多
的是viewer(视图)这个概念,而不像vb等开发中经常用到的window(窗口),并不是说rcp中没有窗口,而是使用
频率较低,所以分别说一下如何添加窗口和viewer

一,添加一个对话框窗口:添加一个类如下,然後在须要显视的地方调用一下open()方法
不一定非要继承自dialog,这里为了渐少一些代码,而且我使用中也多继承自dialog
package hellorcp;

import org.eclipse.swt.swt;
import org.eclipse.swt.widgets.dialog;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;

public class hellodialog extends dialog {

 protected object result;

 protected shell shell;

 public hellodialog(shell parent, int style) {
  super(parent, style);
 }

 public hellodialog(shell parent) {
  this(parent, swt.none);
 }
 public object open() {
  createcontents();
  shell.open();
  shell.layout();
  display display = getparent().getdisplay();
  while (!shell.isdisposed()) {
   if (!display.readanddispatch())
    display.sleep();
  }
  return result;
 }

 protected void createcontents() {
  shell = new shell(getparent(), swt.dialog_trim | swt.application_modal);
  shell.setsize(500, 375);
  shell.settext("swt dialog");
  //
 }

}

二,添加一个viewer,首先建立一个viewer,下边是designer(一个很好用的插件)自动生成的一个viewer,
也就是一个viewer的大概结构
package hellorcp;

import org.eclipse.jface.action.imenumanager;
import org.eclipse.jface.action.itoolbarmanager;
import org.eclipse.swt.swt;
import org.eclipse.swt.widgets.composite;
import org.eclipse.ui.part.viewpart;

public class helloview extends viewpart {

 public static final string id = "hellorcp.helloview"; //$non-nls-1$

 public void createpartcontrol(composite parent) {
  composite container = new composite(parent, swt.none);
  //
  createactions();
  initializetoolbar();
  initializemenu();
 }

 private void createactions() {
  // create the actions
 }
 private void initializetoolbar() {
  itoolbarmanager toolbarmanager = getviewsite().getactionbars()
    .gettoolbarmanager();
 }

 private void initializemenu() {
  imenumanager menumanager = getviewsite().getactionbars()
    .getmenumanager();
 }

 public void setfocus() {
  // set the focus
 }

}
显视这个viewer,每个viewer须要加载到perspective上才能显视,所以在perspective.java中加入如下代码
public void createinitiallayout(ipagelayout layout) {
 layout.seteditorareavisible(false);//不显视edit窗口
 string editorarea = layout.geteditorarea();
 //下边两句的不同是,一个显视的是单页窗口,一个显视的是多页窗口
 layout.addstandaloneview(helloviewer.id,false, ipagelayout.left, 0.25f, editorarea);
 layout.addview(helloviewer.id, ipagelayout.right, 0.75f, editorarea);

三,在viewer或者dialog上添加控件,如果装有designer可以直接拖放,如果没有编程实现也可以
大部份添加到下边这样的函数中
viewer:
public void createpartcontrol(composite parent) {
  composite container = new composite(parent, swt.none);
  //添加一个button
  final button delbtn = new button(container, swt.none);
  delbtn.settext("删除");
  delbtn.setbounds(10, 83, 44, 22);
  addlistener2delbtn(delbtn);
  
  createactions();
  initializetoolbar();
  initializemenu();
}
dialog:
protected void createcontents() {
  shell = new shell(getparent(), swt.dialog_trim | swt.application_modal);
  shell.setsize(500, 375);
  shell.settext("swt dialog");

四,响应事件,swt的事件响应和swing是一样的,添加listener
delbtn.addselectionlistener(new selectionadapter() {
   public void widgetselected(selectionevent e) {
    //加入你响应事件要做的事情
   }
});

五,布局
布局方面swt没有什么新的地方,发个简单使用布局的例子,参考吧.另外布局还有很多搭配,但不是本文的
重点,暂时带过
import org.eclipse.swt.swt;
import org.eclipse.swt.events.selectionevent;
import org.eclipse.swt.events.selectionlistener;
import org.eclipse.swt.graphics.font;
import org.eclipse.swt.graphics.point;
import org.eclipse.swt.graphics.rectangle;
import org.eclipse.swt.layout.formattachment;
import org.eclipse.swt.layout.formdata;
import org.eclipse.swt.layout.formlayout;
import org.eclipse.swt.widgets.button;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.shell;
import org.eclipse.swt.widgets.table;
import org.eclipse.swt.widgets.tablecolumn;
import org.eclipse.swt.widgets.tableitem;

public class tabledemo {

  /**
  * @param args
  */
  public static void main(string[] args) {
    display   dispmain = new display ();
   
    final shell shellmain = new shell (dispmain, swt.title | swt.min | swt.border);
       
    shellmain.settext("table demo");
   
    formlayout formlayout = new formlayout();
    formlayout.marginleft = 10;
    formlayout.marginright = 10;
    formlayout.margintop = 10;
    formlayout.marginbottom = 10;
    formlayout.spacing = 10;
    shellmain.setlayout(formlayout);

    shellmain.setsize(800, 600);
    point size = shellmain.getsize();
    rectangle rect = dispmain.getbounds();
    shellmain.setlocation(rect.x (rect.width-size.x)/2, rect.y (rect.height-size.y)/2);

    table demotable = (table)createcontents(shellmain);    
    formdata formdata = new formdata();
    formdata.left = new formattachment(0, 0);
    formdata.top = new formattachment(0, 0);
    formdata.right = new formattachment(100, 0);
    formdata.bottom = new formattachment(100, -34);
    demotable.setlayoutdata(formdata);

    button btnclose = new button(shellmain, swt.push | swt.flat);
    btnclose.settext("close");
   
    formdata = new formdata();
    formdata.right = new formattachment(100, 0);
    formdata.top = new formattachment(demotable, 0);
    formdata.width = 100;
    formdata.bottom = new formattachment(100, 0);
    btnclose.setlayoutdata(formdata);
   
    btnclose.addselectionlistener(
        new selectionlistener() {
          public void widgetdefaultselected(selectionevent e) {
            this.widgetselected(e);
          }
         
          public void widgetselected(selectionevent e) {
            shellmain.close();
          }
        }
    );
    shellmain.open ();
   
    while (!shellmain.isdisposed ()) {
        if (!dispmain.readanddispatch ()) {
          dispmain.sleep ();
        }
    }
    dispmain.dispose ();
    dispmain = null;
  }

  /**
  *
  * @param shellmain
  * @return
  */
  private static table createcontents(shell shellmain) {
    table table = new table(shellmain, swt.h_scroll | swt.v_scroll | swt.border);
    table.setheadervisible(true);
    table.setlinesvisible(true);
    table.setfont(new font(shellmain.getdisplay(), "arial", 11, swt.bold));
   
    tablecolumn colnumber = new tablecolumn(table, swt.none);
    tablecolumn colmedname = new tablecolumn(table, swt.center);
    tablecolumn colprice = new tablecolumn(table, swt.center);
    tablecolumn colunit = new tablecolumn(table, swt.center);
    tablecolumn colcount = new tablecolumn(table, swt.center);
   
    colnumber.setwidth(25);
   
    colmedname.setwidth(150);
    colmedname.settext("medicine name");
   
    colprice.setwidth(150);
    colprice.settext("medicine price");
   
    colunit.setwidth(150);
    colunit.settext("medicine unit");
   
    colcount.setwidth(150);
    colcount.settext("medicine count");
   
    for(int i=0; i<10; i ) {
        tableitem item = new tableitem(table, swt.none);
        item.settext(new string[]{i 1 "","4/2","4/3","4/4","4/5","4/6","4/7","4/8","4/9"});
    }
    return table;
  }
}
五,加入 右键 ,双击
加入两个listener
//右键
private void hookcontextmenu() {
  menumanager menumgr = new menumanager("#popupmenu"); //$non-nls-1$
  menumgr.setremoveallwhenshown(true);
  menumgr.addmenulistener(new imenulistener() {
   public void menuabouttoshow(imenumanager manager) {
    helloview.this.fillcontextmenu(manager);
   }
  });
  menu menu = menumgr.createcontextmenu(viewer.getcontrol());
  viewer.getcontrol().setmenu(menu);
  getsite().registercontextmenu(menumgr, viewer);
}
private void fillcontextmenu(imenumanager manager) {
  manager.add(addaction);
  manager.add(modifyaction);
  manager.add(deleteaction);
  manager.add(new separator(iworkbenchactionconstants.mb_additions));
}
//双击
private void hookdoubleclickaction() {
  viewer.adddoubleclicklistener(new idoubleclicklistener() {
   public void doubleclick(doubleclickevent event) {
    //doubleclickaction.run();
   }
  });
}

六,使用tableviewer
jface中封装了talbeviewer treeviewer等控件,能简单的实现很多功能,首先说说tableview
//swt.full_selection 可以选中一整行
//swt.multi 可以选中多行
viewer = new tableviewer(warelistgroup, swt.border | swt.full_selection
    | swt.multi);
  final table table = viewer.gettable();
  table.setheadervisible(true);//显视表头
  table.setlinesvisible(true);//显视表格
  
  //实现点击表头自动重新排序
  final tablecolumn num = new tablecolumn(table, swt.none);
  num.addselectionlistener(new selectionadapter() {
   public void widgetselected(selectionevent e) {
    resetsort(wareviewersort.num);
    //resetsort是自己实现的重新排序的函数,只须要把不通的viewersort重新设置给
    tableviewer,并刷新
   }
  });
  num.setalignment(swt.center);
  num.setwidth(50);
  //这个地方使用了message,只要做过国际话的大概都能明白
  num.settext(messages.getstring("helloview.warenum")); //$non-nls-1$

  final tablecolumn name = new tablecolumn(table, swt.none);
  name.addselectionlistener(new selectionadapter() {
   public void widgetselected(selectionevent e) {
    resetsort(wareviewersort.name);//同上
   }
  });
  name.setwidth(80);
  name.settext(messages.getstring("wareview.warename")); //$non-nls-1$
  name.setalignment(swt.center);
  
  final tablecolumn desc = new tablecolumn(table, swt.none);
  desc.addselectionlistener(new selectionadapter() {
   public void widgetselected(selectionevent e) {
    resetsort(wareviewersort.desc);
   }
  });
  desc.setwidth(110);
  desc.settext(messages.getstring("wareview.waredesc")); //$non-nls-1$

  final tablecolumn price = new tablecolumn(table, swt.none);
  price.addselectionlistener(new selectionadapter() {
   public void widgetselected(selectionevent e) {
    resetsort(wareviewersort.price);
   }
  });
  price.setwidth(70);
  price.settext(messages.getstring("wareview.wareprice")); //$non-nls-1$
  price.setalignment(swt.right);

  final tablecolumn upddate = new tablecolumn(table, swt.none);
  upddate.addselectionlistener(new selectionadapter() {
   public void widgetselected(selectionevent e) {
    resetsort(wareviewersort.upddate);
   }
  });
  upddate.setwidth(150);
  upddate.settext(messages.getstring("wareview.wareupddate")); //$non-nls-1$
  upddate.setalignment(swt.center);
  //一个tableviewer里边的数据变动主要取决于下边四句
  viewer.setcontentprovider(new warecontentprovider()); //表的显视
  viewer.setlabelprovider(new warelabelprovider());    //表的数据提供者

  viewer.setinput(//真实的数据来源); //数据来源例如arraylist等
  viewer.setsorter(new wareviewersort()); //排序
  
两个provider的实现类似下边的情况  
class warecontentprovider implements istructuredcontentprovider {

  public object[] getelements(object inputelement) {
   if (inputelement instanceof node) {
    arraylist list = new arraylist();
    makewarelist(((node) inputelement), list);
    return list.toarray();
   }
   if (inputelement instanceof list) {
    return ((list) inputelement).toarray();
   }
   return null;
  }

  public void dispose() {
   // todo auto-generated method stub

  }

  public void inputchanged(viewer viewer, object oldinput, object newinput) {
   // todo auto-generated method stub

  }

 }

class warelabelprovider extends labelprovider implements
   itablelabelprovider {

  public image getcolumnimage(object element, int columnindex) {
   // todo auto-generated method stub
   return null;
  }

  public string getcolumntext(object element, int columnindex) {
   if (element instanceof ware) {
    switch (columnindex) {
    case 0:
     return ((ware) element).getdisplaynum();
    case 1:
     return ((ware) element).getdisplayname();
    case 2:
     return ((ware) element).getdisplaydesc();
    case 3:
     return ((ware) element).getdisplayprice();
    case 4:
     return ((ware) element).getdisplayupddate();
    default:
     break;
    }
   }
   return null;
  }

 }
 



dreamstone 2006-11-06 14:32
]]>
eclipse rcp系列 二 第一个rcp程序http://www.blogjava.net/dreamstone/archive/2006/11/06/79384.htmldreamstonedreamstonemon, 06 nov 2006 05:40:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/06/79384.htmlhttp://www.blogjava.net/dreamstone/comments/79384.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/06/79384.html#feedback0http://www.blogjava.net/dreamstone/comments/commentrss/79384.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79384.html第一个 rcp 程序

新建 ->project->plug-in development->plug-in project

image001.png

点击 next

 

image003.png

输入工程名 hellorcp à next

 

image005.png

其它采取默认,rich client application部分选择 yes

 

image008.png

选择 hello rcp à   finish

 

工程建立完毕,下边选择 manifest.mf

image010.png

点击下边的 overview 进入 overview 视图,点击 launch an eclipse application

就可以看到运行起来的界面了。就使一个简单的窗口。

好,下边如何导出能类似 eclipse 的程序

hellorcp 工程上点击右键 à new à other

image012.png

选择 product configuration

 

image014.png

在划线部分填入 hellorcp finish

image018.png

 

在三处分辨填入对应的内容,然後点击 configuration 进入 configuration 视图

add à 选择 hellorcp

点击 add required plug-ins

然後点击划线部分,按照向导,导出成一个 exe 工程。双击运行一下看看吧。

 

另外导出的这个工程和 eclipse 一样,比如语言啦 -nl 参数,比如 jre 的设置啦 -vm

最大最小内存了,都和 eclipse 是一样的。

好了,这个就是一个工程的过程。前两篇文章内容很少,都是配制方面的,下边的文章开始真的多一些内容了。

 



dreamstone 2006-11-06 13:40
]]>
eclise rcp 系列一 第一个swt程序http://www.blogjava.net/dreamstone/archive/2006/11/06/79371.htmldreamstonedreamstonemon, 06 nov 2006 04:42:00 gmthttp://www.blogjava.net/dreamstone/archive/2006/11/06/79371.htmlhttp://www.blogjava.net/dreamstone/comments/79371.htmlhttp://www.blogjava.net/dreamstone/archive/2006/11/06/79371.html#feedback1http://www.blogjava.net/dreamstone/comments/commentrss/79371.htmlhttp://www.blogjava.net/dreamstone/services/trackbacks/79371.html写在开始:
由于工作须要,做了一周时间的rcp开发,发现由于eclipse开发方面的中文资料较少,对入门者来说有些困难,
所以把自己一周的内容放上,共享给开始学习eclipse开发的人
eclipse开发中有很多名词: 插件开发  ,rcp ,swt,jface很容易让人迷糊
做个大概的比喻,如果说swt是c 的话  那么jface就像stl对swt做了简单的封装  rcp就像mfc封装更多
而插件开发和rcp唯一不同就使导出不同,一个导出成plug in,另一个导出成独立运行的程序。其实没有什么区别

好了,开始第一个程序,从hello world开始。写到这个地方,再次崇拜一下第一个写hello world的人。
真应改给他搬个什么普及教育之类的奖项。
import org.eclipse.swt.swt;
import org.eclipse.swt.widgets.display;
import org.eclipse.swt.widgets.label;
import org.eclipse.swt.widgets.shell;


public class helloswt {

 public static void main(string[] args) {
  display display = new display();
  shell shell = new shell(display);
  label label = new label(shell, swt.center);
  label.settext("hello, world");
  label.setbounds(shell.getclientarea());
  shell.open();
  while (!shell.isdisposed()){
    if (!display.readanddispatch()){
     display.sleep();
    }
  }
  display.dispose();
 }
}

首先介绍display,打家都知到swt是基于操做系统的,多大部分的控、 窗口都是调用系统的,所以得有一个东西
负责把java的消息转变成系统消息,display就是。

shell可以简单理解成就是窗口

label就是一个标签了。

shell.open()显视窗口

while (!shell.isdisposed()){
  if (!display.readanddispatch()){
   display.sleep();
  }
}
熟悉windows下编程的人大概都知到,windows的消息循环机制。

好了试着运行一下这个程序,修改一下,找找感觉吧。

写到这里忽然想起自己没有写如何配制swt的开发环境,对于新手来说这个是重要的。
这里有一篇文章
如果链接失效的话google一下吧

说明:
这个系列的文章是基于eclipse 3.2.1的,另外推荐一些学习的资料或者网站
首先:
然後:在上边的论坛里边有一些前辈们写的教程,有些不错值得一看
最后:当然不可少的是ibm的网站和eclipse的官方网站

 

 

 



dreamstone 2006-11-06 12:42
]]>
网站地图