原来在静态代码块上出现了exception,造成在运行main函数之前就退出了。所以才说没有main函数。
我们知道classload在加载一个类的时候,对于静态代码块会逐行执行,按照出现的先后顺序。同时父类的静态代码块一定比子类的先执行。因为
在load子类之前会先load父类。这就是为什么hello world中不会出现问题,这里会出现问题的原因。因为dialog比applicationwindow多了这段静态代码。
继续追下去为什么这段代码会出现空指针异常呢,原来这段代码依赖于new shell()必须先运行。而我们的new shell()写在main方法里边,肯定是在加载类完成后才能运行的。所以在类内部直接写个main方法是不行的。只能单独写个类来调用。
方法二:
单独写个类如下:
2,这四个的不同之处有三点:
提示的图标、 显示的按钮、 返回值
openinfomation 类似i的图标 一个确定 void
openconfirm 问号图标 确定和取消 boolean
openquestion 问号图标 是和否 boolean
openerror 一个x的图标 确定 void
最后说一下,messagedialog的大小不能根据内容自动调整,对于少量提示信息的时候显得大了些。
3,inputdialog输入的dialog
使用方法:
做过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中遍地都是的用法。
错误二:
按照教程的操作,结果出现错误
org.eclipse.ui.partinitexception: unable to open editor, unknown editor id:
检查你的plugin.xml中的这一段
default="false"
icon="icons/alt_about.gif"
id="gef.tutorial.step.ui.diagrameditor"
name="diagram editor"/>
是否有icon="",我开始以为没有icon没什么所以没配置,结果一直出错,配上就好了。感觉这个做的真
让人郁闷,还必须有icon
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
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
}
}
一,添加一个对话框窗口:添加一个类如下,然後在须要显视的地方调用一下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;
}
}
新建 ->project->plug-in development->plug-in project
点击 next
输入工程名 hellorcp à next
选择 hello rcp à finish
工程建立完毕,下边选择 manifest.mf
点击下边的 overview 进入 overview 视图,点击 launch an eclipse application
就可以看到运行起来的界面了。就使一个简单的窗口。
好,下边如何导出能类似 eclipse 的程序
在 hellorcp 工程上点击右键 à new à other
选择 product configuration
在三处分辨填入对应的内容,然後点击 configuration 进入 configuration 视图
add à 选择 hellorcp
点击 add required plug-ins
然後点击划线部分,按照向导,导出成一个 exe 工程。双击运行一下看看吧。
另外导出的这个工程和 eclipse 一样,比如语言啦 -nl 参数,比如 jre 的设置啦 -vm
最大最小内存了,都和 eclipse 是一样的。
好了,这个就是一个工程的过程。前两篇文章内容很少,都是配制方面的,下边的文章开始真的多一些内容了。
好了,开始第一个程序,从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的官方网站