首页 > 开发 > 综合 > 正文

Swt常用控件中文教程

2024-07-21 02:15:06
字体:
来源:转载
供稿:网友
国内最大的酷站演示中心!

  1、eclipse中swt的配置

  建议配置:jdk1.4.2以及eclipse3.1

  在代码中调用swt控件之前,首先建立一个项目,然后选择该项目的properties -> java build path,将standard widget toolkit加入到library页当中。如下图所示:

  接下来可以建立第一个eclipse小程序,新建一个class,并且在该class所对应的代码中输入如下程序,其中package以及class名称根据实际情况来确定名称。

package mypakage;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.*;
/*导入需要的类库*/
public class myfrm1 {
public myfrm1() {
super();
}
public static void main(string[] args) {
display display = new display();
shell shell = new shell(display);
/*shell为一个窗口对象*/
label label = new label(shell, swt.none);
label.settext("hello, world!"); /*创建一个标签对象并且设置标题文字*/
label.pack();
shell.pack();
shell.open(); /*打开并显示窗口*/

while(!shell.isdisposed())
if(!display.readanddispatch())
display.sleep(); /*在窗口没有销毁之前,显示对象一直处于等待状态*/

display.dispose(); /*否则,销毁对象,释放对象所占据的资源*/
label.dispose();
}
}

  运行上述代码(run -> debug -> swt application)将产生如下所示的一个窗口

  2、button的使用

  按钮可能的类型有很多,例如:

swt.border 含有边框的按钮

swt.check 复选按钮

swt.push 普通按钮

swt.radio 单选按钮

  3、text的使用

  文本框的类型也有很多种选择,例如:

swt.border 含有边框

swt.read_only 只读

  下图为包含按钮以及文本框的窗口

  设计上述窗口所对应的代码为:

package mypakage;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.swt;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
public class myfrm1 {
public myfrm1() {
super();
}
public static void main(string[] args) {
display display = new display( );
shell shell = new shell(display);
shell.setsize(300, 200);
shell.setlayout(new rowlayout( ));
shell.settext("button example");
final button button = new button(shell, swt.border);
button.settext("click me");
final text text = new text(shell, swt.border);
shell.open( );

while(!shell.isdisposed( )) {
if(!display.readanddispatch( )) display.sleep( );
}
display.dispose( );
}
}

  如果想对控件的位置以及大小进行精确的设置,可以使用setbounds(x, y, width, height)方法来取代shell.setlayout(new rowlayout( ))。例如:button.setbounds(80, 80, 90, 20);

  button的监听及事件处理

  对按钮单击事件处理的代码:

button.addselectionlistener(new selectionlistener( )
{
public void widgetselected(selectionevent event)
{
text.settext("no worries!");
}
public void widgetdefaultselected(selectionevent event)

{
text.settext("no worries!");
}
});

  将以上代码加入到shell.open之前,当点击按钮时产生以下效果:


  分析:由于为button按钮增加了一个监听器,按钮时刻处于被“监控”的状态,当按钮控件被选择(点击)既选择事件发生时,对文本控件进行赋值”no worries”。

  根据监听事件的原理,设计如下程序,该程序能够获得鼠标的x坐标,显示在文本框中:

package mypakage;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.swt;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;

public class myfrm1 {
public myfrm1() {
super();
}
public static void main(string[] args) {
display display = new display( );
shell shell = new shell(display);
shell.setsize(300, 200);
shell.setlayout(new rowlayout( ));
final text text = new text(shell, swt.shadow_in);

shell.addmousemovelistener(new mousemovelistener( )
{
public void mousemove(mouseevent e)
{
integer y=new integer(e.x); /*将x坐标转换为integer类型的对象*/
text.settext(y.tostring());
}
});

shell.open( );
while(!shell.isdisposed( )) {
if(!display.readanddispatch( )) display.sleep( );
}
display.dispose( );
}
}

  监听方式:

controllistener 用于处理移动以及尺寸变化

focuslistener 用于处理得到焦点以及失去焦点

keylistener 处理按键的输入

mouselistener , mousemovelistener, mousetracklistener 对鼠标的动作进行处理

selectionlistener 处理控件的选择行为(包括按钮的点击)

  注意:监听方式与其所能够处理的事件具有一定的关联性,既监听方式决定了所能够处理事件的种类,例如:

shell.addmouselistener(new mouselistener( )
{
public void mousemove(mouseevent e)
{text.settext("mousemove");}
public void mousedoubleclick(mouseevent e)
{text.settext("mousedbclc");}
public void mousedown(mouseevent e)
{}
public void mouseup(mouseevent e)
{}
});

  你会发现在鼠标移动时,text.settext("mousemove");始终不能够执行;并且mousedown、mouseup事件不能够省略,原因就在于mouselistener只能处理mousedoubleclick、mousedown、mouseup三类事件,而且这三类事件不能够分离。

  3、list控件

  list控件的样式包括:

swt.border 含有边框

swt.h_scroll 含有水平滚动条

swt.v_scroll 含有垂直滚动条

swt.single 允许单选

swt.multi 允许复选

  若要创建一个含有从11个元素的list,可以通过以下代码来实现

final list list = new list (shell, swt.single);
for (int i=0;i<=10;i++)
list.add("item"+i);

  以下实例能够判断list控件中所选择的选项,并且输出显示在控制台中:

package mypakage;
import org.eclipse.swt.widgets.*;
import org.eclipse.swt.swt;
import org.eclipse.swt.events.*;
import org.eclipse.swt.layout.*;
public class myfrm1 {
public myfrm1() {
super();
}
public static void main(string[] args) {
display display = new display ( );
shell shell = new shell (display);
shell.settext("list example");
shell.setsize(300, 200);
shell.setlayout(new filllayout(swt.vertical));
final list list = new list (shell, swt.border | swt.multi | swt.v_scroll);
for (int loopindex = 0; loopindex < 100; loopindex++){
list.add("item " + loopindex);
}
list.addselectionlistener(new selectionlistener( )
{
public void widgetselected(selectionevent event)
{
int selections[] = list.getselectionindices ( );
string outtext = "";
for (int loopindex = 0; loopindex < selections.length;
loopindex++) outtext += selections[loopindex] + " ";
system.out.println ("you selected: " + outtext);
}
public void widgetdefaultselected(selectionevent event)
{
int [] selections = list.getselectionindices ( );
string outtext = "";
for (int loopindex = 0; loopindex < selections.length; loopindex++)
outtext += selections[loopindex] + " ";
system.out.println ("you selected: " + outtext);
}
});
shell.open ( );
while (!shell.isdisposed ( )) {
if (!display.readanddispatch ( )) display.sleep ( );
}
display.dispose ( );
}
}

  效果图:

  you selected: 4 5 6 7 8 9 10

  分析:list.getselectionindices ( )方法将会获得被选择项目的集合, selections[]或者[] elections表示动态一维数组。

  4、menu控件

  建立菜单的一般步骤为:

  1、在建立菜单时,首先需要建立一个菜单栏,需要使用swt.bar属性

  menu menubar = new menu(shell, swt.bar);

  2、在菜单栏的基础之上,创建下拉菜单的所对应的顶级菜单项,需要使用swt.cascade属性
filemenuheader = new menuitem(menubar, swt.cascade);

  filemenuheader.settext("&file");

  3、建立与顶级菜单项相关的下拉式菜单

  dropmenu1 = new menu(shell, swt.drop_down);

  4、将顶级菜单项与下拉菜单关联

menuheader1.setmenu(dropmenu1);

  5、为下拉菜单添加子菜单项

dropitem1= new menuitem(dropmenu1, swt.push);
dropitem1.settext("open");

  6、最后,在窗口中指定需要显示的菜单栏

shell.setmenubar(menubar);

  菜单的监听及事件

  参照按钮的监听以及事件,设计如下程序,当点击 file子菜单下的“open”时,在文本框中显示“click open menu!”

dropitem1.addselectionlistener(new selectionlistener()
{
public void widgetselected(selectionevent event)
{
text.settext("click open menu!");
}
public void widgetdefaultselected(selectionevent event)
{
text.settext("click open menu!");
}
});

  5、使用工具栏toobar

  建立工具栏可以通过如下方式:toolbar toolbar = new toolbar(shell, swt.none);

  在工具栏的基础之上创建工具栏子按钮,并且设置子按钮的标题:

toolitem item1 = new toolitem(toolbar, swt.push);
item1.settext("item1");

  例如:

toolbar toolbar = new toolbar(shell, swt.none);
toolitem item1 = new toolitem(toolbar, swt.push);
item1.settext("item1");
toolitem item2 = new toolitem(toolbar, swt.push);
item2.settext("item2");

  工具栏的监听及事件

  实例:创建一个监听对象,将该监听对象应用于每一个按钮,最终来判断鼠标点击的是哪一个按钮,效果图如下。

listener listener = new listener( ) {
public void handleevent(event event) {
toolitem item =(toolitem)event.widget;
string string = item.gettext( );
text.settext("you selected:" + string); }
};
item1.addlistener(swt.selection, listener);
item2.addlistener(swt.selection, listener);
item3.addlistener(swt.selection, listener);
item4.addlistener(swt.selection, listener);

  6、滚动条slider的使用

  滚动条分为有边框、垂直、水平三种类型,利用slider.setbounds方法可以指定滚动条所在的位置。

  滚动条所能够处理事件的包括:

swt.arrow_down 向下或向右按钮被点击

swt.arrow_up 向左或向上按钮被点击

swt.drag 滑块按钮被托动

swt.end 滑块到达终点

swt.home 滑块到达起点

swt.page_down 下方或右侧的滚动条被点击

swt.page_up 上方或左侧的滚动条被点击

  实例:根据滑块的位置移动按钮位置

slider.addlistener(swt.selection, new listener( ) {

public void handleevent(event event) {

switch(event.detail) {

case swt.arrow_down: button.setbounds(slider.getselection(),0,20,10);

break;

case swt.arrow_up:button.setbounds(slider.getselection(),0,20,10);

break;

case swt.drag:button.setbounds(slider.getselection(),0,20,10);

break;

case swt.end:button.setbounds(slider.getselection(),0,20,10);

break;

case swt.home:button.setbounds(slider.getselection(),0,20,10);

break;

case swt.page_down:button.setbounds(slider.getselection(),0,20,10);

break;

case swt.page_up:button.setbounds(slider.getselection(),0,20,10);

break;

}
}

});

  7、树形控件tree

  树形控件使用的方法为,首先创建一个tree类型的对象,其次在该对象的基础之上继续扩展节点,以及扩展节点的子节点。

  final tree tree = new tree(shell, swt.border);

  可以利用tree.setsize方法来改变树形控件的大小。在创建节点时,需要指明该节点所依赖的父节点的名称,如treeitem item0 = new treeitem(tree, 0);,那么item0将成为tree对象中的0级(顶级)节点。

  如下程序将在tree对象的基础之上产生9个节点:

final tree tree = new tree(shell, swt.border);

tree.setsize(290, 290);

for(int loopindex1 = 2000; loopindex1 <= 2008; loopindex1++) {

treeitem item0 = new treeitem(tree, 0);

item0.settext("year " + loopindex1);

}

  在上述实例的基础上为每一个0级节点的基础上扩展出12个节点:

for(int loopindex1 = 2000; loopindex1 <= 2008; loopindex1++) {

treeitem item0 = new treeitem(tree, 0);

item0.settext("year " + loopindex1);

for(int loopindex2 = 1; loopindex2 <= 12; loopindex2++) {

treeitem item1 = new treeitem(item0, 0);

item1.settext("month " + loopindex2);
}

}

  8、对话框dialog

  对话框是一个依托于主窗体的子窗体,如图所示。

  例如:当在主窗体中点击按钮时,弹出一个对话框dialog,当关闭对话框时按钮显示“dialog is disposed”

display display = new display( );

final shell shell = new shell(display);

shell.setsize(300, 200);

shell.settext("main");

final button opener = new button(shell, swt.push);

opener.settext("click me");

opener.setbounds(20, 20, 50, 25);

final shell dialog = new shell(shell, swt.application_modal |

swt.dialog_trim);

dialog.settext("dialog");

dialog.setbounds(10,10,50,60);

dialog.adddisposelistener(new disposelistener(){

public void widgetdisposed(disposeevent e){

opener.settext("dialog is disposed");

}
});

listener openerlistener = new listener( ) {

public void handleevent(event event) {

dialog.open( );

}

};

opener.addlistener(swt.selection, openerlistener);

shell.open( );

while(!dialog.isdisposed( )) {

if(!display.readanddispatch( )) display.sleep( );

}

while (!shell.isdisposed( )) {

if (!display.readanddispatch( ))

display.sleep( );

}

display.dispose( );

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表