| |
一、swt简介
java语言的声望和它在桌面应用程序(gui程序)所取得的成就显然极不相符,至今仍然很少能看到非常成功java桌面程序。虽然有jbuilder,netbean,jprobe等大型软件作为代表,但这仍不能证明java的gui程序是成功的:它们的外观总是和同一操作系统平台下的其它软件显得格格不入。对机器配置的需求也似乎永无止境,这使得它们只能被一些总是拥有当前最高性能pc的程序员们所容忍,或是那些不在乎金钱和时间的专业用户所接受。对绝大多数计算机使用者来说,awt或swing代表着怪异的界面和无法接受的速度。standard widget toolkit(swt)或许是java这一噩梦的终结者,广大java程序员终于可以开发出高效率的gui程序,它们拥有标准的外观,几乎没有人能看出你的程序是用java写出来的,更为重要的是,这些程序是跨平台的。
swt本身仅仅是eclipse组织为了开发eclipse ide环境所编写的一组底层图形界面 api。或许是无心插柳,或是有意为之,至今为止,swt无论是在性能和外观上,都超越了sun公司提供的awt和swing。目前eclipse ide已经开发到了2.1版本,swt已经十分稳定。这里指的稳定应该包含两层意思:
一是指性能上的稳定,其中的关键是源于swt的设计理念。swt最大化了操作系统的图形构件api,就是说只要操作系统提供了相应图形的构件,那么swt只是简单应用jni技术调用它们,只有那些操作系统中不提供的构件,swt才自己去做一个模拟的实现。可以看出swt的性能上的稳定大多时候取决于相应操作系统图形构件的稳定性。
另一个稳定是指swt api包中的类、方法的名称和结构已经少有改变,程序员不用担心由于eclipse组织开发进度很快(eclipse ide每天都会有一个nightly版本的发布),而导致自己的程序代码变化过大。从一个版本的swt更新至另一版本,通常只需要简单将swt包换掉就可以了。
二、eclipse3.0的swt编程
1.swt比awt和swing要快多,因为它是利用操作系统的界面组件生成ui的,在java桌面设计领域掀起一场革命
2.环境配置:
windows系统+eclipse3.0
3.具体操作:
(1).新建一java项目,命名swt,文件结构如下:
+swt +bin(编译输出) +src(原文件) +addressbookui.java +swt-awt-win32-3062.dll(以下均从eclipse/plugins/org.eclipse.swt.win32_3.0.1/os/win32/x86下导入) +swt-win32-3062.dll +javaw.exe.manifest
(2).到项目的properties里,在java build path | libraries里将swt.jar导入
(3).addressbookui.java原代码如下:
import org.eclipse.swt.widgets.display; import org.eclipse.swt.widgets.shell; import org.eclipse.swt.swt; import org.eclipse.swt.widgets.button; import org.eclipse.swt.widgets.group; import org.eclipse.swt.widgets.label; import org.eclipse.swt.widgets.text; import org.eclipse.swt.widgets.*; import org.eclipse.swt.events.selectionadapter; import org.eclipse.swt.events.selectionevent; public class addressbookui { private shell shell; private text misctext; private text addrtext; private text emailtext; private text phonetext; private text lnametext; private text fnametext; private button cancelbutton; private button savebutton; private button nextbutton; private button prevbutton; private button editbutton; private button deletebutton; private button newbutton; public static void main(string[] args) { addressbookui window = new addressbookui(); window.open(); } public void open() { final display display = new display(); shell = new shell(); shell.setsize(610, 477); shell.settext("address book"); { newbutton = new button(shell, swt.none); newbutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { cleartext(); settexteditable(true); enableeditbuttons(false); enablesavebuttons(true);
system.out.println("new button selected."); } }); newbutton.setbounds(10, 380, 75, 35); newbutton.settext("new"); } { deletebutton = new button(shell, swt.none); deletebutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { cleartext();
system.out.println("delete button selected."); } }); deletebutton.setbounds(85, 380, 75, 35); deletebutton.settext("delete"); } { editbutton = new button(shell, swt.none); editbutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { settexteditable(true); enableeditbuttons(false); enablesavebuttons(true); system.out.println("edit button selected."); } }); editbutton.setbounds(160, 380, 75, 35); editbutton.settext("edit"); } { prevbutton = new button(shell, swt.none); prevbutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { system.out.println("previous button selected."); } }); prevbutton.setbounds(265, 380, 75, 35); prevbutton.settext("previous"); } { nextbutton = new button(shell, swt.none); nextbutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { system.out.println("next button selected."); } }); nextbutton.setbounds(340, 380, 75, 35); nextbutton.settext("next"); } { savebutton = new button(shell, swt.none); savebutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { settexteditable(false); enableeditbuttons(true); enablesavebuttons(false); system.out.println("save button selected."); } }); savebutton.setbounds(445, 380, 75, 35); savebutton.settext("save"); savebutton.setenabled(false); } { cancelbutton = new button(shell, swt.none); cancelbutton.addselectionlistener(new selectionadapter() { public void widgetselected(selectionevent e) { settexteditable(false); enableeditbuttons(true); enablesavebuttons(false);
system.out.println("cancel button selected."); } }); cancelbutton.setbounds(520, 380, 75, 35); cancelbutton.settext("cancel"); cancelbutton.setenabled(false); } { final group group = new group(shell, swt.none); group.settext("details"); group.setbounds(10, 10, 585, 355); { final label label = new label(group, swt.none); label.setbounds(10, 20, 135, 25); label.settext("first name:"); } { final label label = new label(group, swt.none); label.setbounds(10, 60, 135, 25); label.settext("last name:"); } { final label label = new label(group, swt.none); label.setbounds(10, 100, 135, 25); label.settext("phone:"); } { final label label = new label(group, swt.none); label.setbounds(10, 140, 135, 25); label.settext("email:"); } { final label label = new label(group, swt.none); label.setbounds(10, 180, 135, 25); label.settext("address:"); } { final label label = new label(group, swt.none); label.setbounds(10, 255, 135, 25); label.settext("miscellaneous information:"); } { fnametext = new text(group, swt.border | swt.read_only); fnametext.setbounds(150, 15, 420, 25); } { lnametext = new text(group, swt.border | swt.read_only); lnametext.setbounds(150, 55, 420, 25); } { phonetext = new text(group, swt.border | swt.read_only); phonetext.setbounds(150, 95, 420, 25); } { emailtext = new text(group, swt.border | swt.read_only); emailtext.setbounds(150, 135, 420, 25); } { addrtext = new text(group, swt.border | swt.read_only | swt.v_scroll); addrtext.setbounds(150, 175, 420, 60); } { misctext = new text(group, swt.border | swt.read_only | swt.v_scroll); misctext.setbounds(150, 250, 420, 65); } }
setupmenu();
shell.open(); while (!shell.isdisposed()) { if (!display.readanddispatch()) display.sleep(); } }
private void setupmenu() { //create the menu bar menu menu = new menu(shell, swt.bar); shell.setmenubar(menu); //add the file option to it menuitem file = new menuitem(menu, swt.cascade); file.settext("file"); //create a menu for the file option file.setmenu(new menu(file)); //add menuitems to the file menu menuitem previtem = new menuitem(new menu(file), swt.none); previtem.settext("previous");
menuitem nextitem = new menuitem(new menu(file), swt.push); nextitem.settext("next");
menuitem seperator = new menuitem(new menu(file), swt.separator); menuitem quititem = new menuitem(new menu(file), swt.push); quititem.settext("quit"); //add listeners for the actions previtem.addlistener(swt.selection, new listener() { public void handleevent(event e) { system.out.println("previous menu item selected."); } }); nextitem.addlistener(swt.selection, new listener() { public void handleevent(event e) { system.out.println("next menu item selected."); } }); quititem.addlistener(swt.selection, new listener() { public void handleevent(event e) { shell.dispose(); } }); }
private void cleartext() { fnametext.settext(""); lnametext.settext(""); phonetext.settext(""); emailtext.settext(""); addrtext.settext(""); misctext.settext(""); }
private void settexteditable(boolean editable) { fnametext.seteditable(editable); lnametext.seteditable(editable); phonetext.seteditable(editable); emailtext.seteditable(editable); addrtext.seteditable(editable); misctext.seteditable(editable); }
private void enableeditbuttons(boolean enable) { newbutton.setenabled(enable); deletebutton.setenabled(enable); editbutton.setenabled(enable); }
private void enablesavebuttons(boolean enable) { savebutton.setenabled(enable); cancelbutton.setenabled(enable); } } |
(4).测试运行,run就可以啦
|
|