一、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就可以,你可以到http://www.java2s.com寻找关于swt的好程序.
闽公网安备 35060202000074号