﻿<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>BlogJava-皇家方舟-随笔分类-swt</title><link>http://www.blogjava.net/xixuui/category/15705.html</link><description /><language>zh-cn</language><lastBuildDate>Fri, 02 Mar 2007 06:41:38 GMT</lastBuildDate><pubDate>Fri, 02 Mar 2007 06:41:38 GMT</pubDate><ttl>60</ttl><item><title>Swt常用控件中文教程(转)</title><link>http://www.blogjava.net/xixuui/archive/2006/09/26/71967.html</link><dc:creator>阿辉</dc:creator><author>阿辉</author><pubDate>Tue, 26 Sep 2006 06:14:00 GMT</pubDate><guid>http://www.blogjava.net/xixuui/archive/2006/09/26/71967.html</guid><wfw:comment>http://www.blogjava.net/xixuui/comments/71967.html</wfw:comment><comments>http://www.blogjava.net/xixuui/archive/2006/09/26/71967.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.blogjava.net/xixuui/comments/commentRss/71967.html</wfw:commentRss><trackback:ping>http://www.blogjava.net/xixuui/services/trackbacks/71967.html</trackback:ping><description><![CDATA[
		<p>(样图没有贴上，不好意思)<br />1、Eclipse中swt的配置<br />建议配置：jdk1.4.2以及eclipse3.1<br />在代码中调用swt控件之前，首先建立一个项目，然后选择该项目的properties -&gt; Java Build Path，将standard Widget ToolKit加入到Library页当中。如下图所示：<br /> 接下来可以建立第一个eclipse小程序，新建一个class，并且在该class所对应的代码中输入如下程序，其中package以及class名称根据实际情况来确定名称。<br />package mypakage;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.*;<br />/*导入需要的类库*/<br />public class Myfrm1 {<br />public Myfrm1() {<br />super();<br />}<br />public static void main(String[] args) {<br />Display display = new Display();<br />Shell shell = new Shell(display);<br />/*shell为一个窗口对象*/<br />Label label = new Label(shell, SWT.NONE);<br />label.setText("Hello, World!");  /*创建一个标签对象并且设置标题文字*/<br />label.pack();<br />shell.pack();<br />shell.open();  /*打开并显示窗口*/<br />while(!shell.isDisposed())<br />if(!display.readAndDispatch())<br />    display.sleep();  /*在窗口没有销毁之前，显示对象一直处于等待状态*/</p>
		<p>display.dispose();  /*否则，销毁对象，释放对象所占据的资源*/<br />label.dispose();<br />}<br />}<br />运行上述代码（run -&gt; debug -&gt; swt application）将产生如下所示的一个窗口 <br />2、button的使用<br />按钮可能的类型有很多，例如：<br />SWT.BORDER  含有边框的按钮<br />SWT.CHECK  复选按钮<br />SWT.PUSH  普通按钮<br />SWT.RADIO  单选按钮<br />3、Text的使用<br />文本框的类型也有很多种选择，例如：<br />SWT.BORDER 含有边框<br />SWT.READ_ONLY 只读<br />下图为包含按钮以及文本框的窗口<br />设计上述窗口所对应的代码为：<br />package mypakage;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.SWT;<br />import org.eclipse.swt.events.*;<br />import org.eclipse.swt.layout.*;<br />public class Myfrm1 {<br />public Myfrm1() {<br />super();<br />}<br />public static void main(String[] args) {<br />Display display = new Display( );<br />        Shell shell = new Shell(display);<br />        shell.setSize(300, 200);<br />        shell.setLayout(new RowLayout( ));<br />        shell.setText("Button Example");<br />        final Button button = new Button(shell, SWT.BORDER);<br />        button.setText("Click Me");<br />        final Text text = new Text(shell, SWT.BORDER);   <br />        shell.open( );</p>
		<p>        while(!shell.isDisposed( )) {<br />               if(!display.readAndDispatch( )) display.sleep( );<br />        }<br />        display.dispose( );<br />}<br />}<br />如果想对控件的位置以及大小进行精确的设置，可以使用setBounds(x, y, width, height)方法来取代shell.setLayout(new RowLayout( ))。例如：button.setBounds(80, 80, 90, 20);<br />button的监听及事件处理<br />对按钮单击事件处理的代码：<br />        button.addSelectionListener(new SelectionListener( )<br />        {<br />               public void widgetSelected(SelectionEvent event)<br />               {<br />                     text.setText("No worries!");<br />               }<br />               public void widgetDefaultSelected(SelectionEvent event)</p>
		<p>               {<br />                     text.setText("No worries!");<br />               }<br />        });</p>
		<p>将以上代码加入到shell.open之前，当点击按钮时产生以下效果：<br />分析：由于为button按钮增加了一个监听器，按钮时刻处于被“监控”的状态，当按钮控件被选择（点击）既选择事件发生时，对文本控件进行赋值”No worries”。<br />根据监听事件的原理，设计如下程序，该程序能够获得鼠标的X坐标，显示在文本框中：<br />package mypakage;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.SWT;<br />import org.eclipse.swt.events.*;<br />import org.eclipse.swt.layout.*;<br />public class Myfrm1 {<br />public Myfrm1() {<br />super();<br />}<br />public static void main(String[] args) {<br />Display display = new Display( );<br />        Shell shell = new Shell(display);<br />        shell.setSize(300, 200);<br />        shell.setLayout(new RowLayout( ));<br />        final Text text = new Text(shell, SWT.SHADOW_IN);</p>
		<p>        shell.addMouseMoveListener(new MouseMoveListener( )<br />        {<br />               public void mouseMove(MouseEvent e)<br />               {<br />                     Integer y=new Integer(e.x);  /*将x坐标转换为Integer类型的对象*/<br />                     text.setText(y.toString()); <br />               }<br />        });</p>
		<p>        shell.open( );<br />        while(!shell.isDisposed( )) {<br />               if(!display.readAndDispatch( )) display.sleep( );<br />        }<br />        display.dispose( );<br />}<br />}<br />监听方式：<br />ControlListener 用于处理移动以及尺寸变化</p>
		<p>FocusListener 用于处理得到焦点以及失去焦点</p>
		<p>KeyListener 处理按键的输入</p>
		<p>MouseListener , MouseMoveListener, MouseTrackListener 对鼠标的动作进行处理</p>
		<p>SelectionListener 处理控件的选择行为（包括按钮的点击）</p>
		<p>注意：监听方式与其所能够处理的事件具有一定的关联性，既监听方式决定了所能够处理事件的种类，例如：</p>
		<p>        shell.addMouseListener(new MouseListener( )<br />        {<br />            public void mouseMove(MouseEvent e)<br />           {text.setText("mousemove");}<br />               public void mouseDoubleClick(MouseEvent e)<br />               {text.setText("mousedbclc");}<br />               public void mouseDown(MouseEvent e)<br />               {}<br />               public void mouseUp(MouseEvent e)<br />               {}<br />        });</p>
		<p>你会发现在鼠标移动时，text.setText("mousemove");始终不能够执行；并且mouseDown、mouseUp事件不能够省略，原因就在于MouseListener只能处理mouseDoubleClick、mouseDown、mouseUp三类事件，而且这三类事件不能够分离。<br />3、List控件<br />List控件的样式包括：<br />SWT.BORDER 含有边框</p>
		<p>SWT.H_SCROLL 含有水平滚动条</p>
		<p>SWT.V_SCROLL 含有垂直滚动条</p>
		<p>SWT.SINGLE 允许单选</p>
		<p>SWT.MULTI 允许复选</p>
		<p>若要创建一个含有从11个元素的List，可以通过以下代码来实现<br />final List list = new List (shell, SWT.SINGLE);<br />for (int i=0;i&lt;=10;i++)<br />   list.add("item"+i);</p>
		<p> </p>
		<p>以下实例能够判断List控件中所选择的选项，并且输出显示在控制台中：<br />package mypakage;<br />import org.eclipse.swt.widgets.*;<br />import org.eclipse.swt.SWT;<br />import org.eclipse.swt.events.*;<br />import org.eclipse.swt.layout.*;<br />public class Myfrm1 {<br />public Myfrm1() {<br />super();<br />}<br />public static void main(String[] args) {<br />        Display display = new Display ( );<br />        Shell shell = new Shell (display);<br />        shell.setText("List Example");<br />        shell.setSize(300, 200);<br />        shell.setLayout(new FillLayout(SWT.VERTICAL));<br />        final List list = new List (shell, SWT.BORDER | SWT.MULTI | SWT.V_SCROLL);           <br />        for (int loopIndex = 0; loopIndex &lt; 100; loopIndex++){ <br />            list.add("Item " + loopIndex);<br />           }<br />        list.addSelectionListener(new SelectionListener( )<br />        {<br />           public void widgetSelected(SelectionEvent event)<br />           {<br />                int  selections[] = list.getSelectionIndices ( );<br />                String outText = "";<br />                for (int loopIndex = 0; loopIndex &lt; selections.length; <br />                    loopIndex++) outText += selections[loopIndex] + " ";<br />                System.out.println ("You selected: " + outText);<br />              }<br />           public void widgetDefaultSelected(SelectionEvent event)<br />           {<br />                int [] selections = list.getSelectionIndices ( );<br />                String outText = "";<br />                for (int loopIndex = 0; loopIndex &lt; selections.length; loopIndex++) <br />                    outText += selections[loopIndex] + " ";<br />               System.out.println ("You selected: " + outText);<br />             }<br />          });<br />          shell.open ( );<br />          while (!shell.isDisposed ( )) {<br />              if (!display.readAndDispatch ( )) display.sleep ( );<br />          }<br />          display.dispose ( );<br />}<br />}</p>
		<p>效果图：<br /> </p>
		<p>You selected: 4 5 6 7 8 9 10<br />分析：list.getSelectionIndices ( )方法将会获得被选择项目的集合， selections[]或者[] elections表示动态一维数组。</p>
		<p>4、Menu控件<br />建立菜单的一般步骤为：<br />1、在建立菜单时，首先需要建立一个菜单栏，需要使用SWT.BAR属性<br />Menu menuBar = new Menu(shell, SWT.BAR);</p>
		<p>2、在菜单栏的基础之上，创建下拉菜单的所对应的顶级菜单项，需要使用SWT.CASCADE属性<br />fileMenuHeader = new MenuItem(menuBar, SWT.CASCADE);<br />fileMenuHeader.setText("&amp;File");</p>
		<p>3、建立与顶级菜单项相关的下拉式菜单<br />dropMenu1 = new Menu(shell, SWT.DROP_DOWN);</p>
		<p>4、将顶级菜单项与下拉菜单关联<br />MenuHeader1.setMenu(dropMenu1);</p>
		<p>5、为下拉菜单添加子菜单项<br />dropitem1= new MenuItem(dropMenu1, SWT.PUSH);<br />dropitem1.setText("open");<br />…<br />…</p>
		<p>6、最后，在窗口中指定需要显示的菜单栏<br />shell.setMenuBar(menuBar);</p>
		<p> </p>
		<p>菜单的监听及事件<br />参照按钮的监听以及事件，设计如下程序，当点击 File子菜单下的“open”时，在文本框中显示“click open menu!”<br />dropitem1.addSelectionListener(new SelectionListener()<br />   {<br />      public void widgetSelected(SelectionEvent event)<br />      {<br />      text.setText("click open menu!");<br />      }<br />      public void widgetDefaultSelected(SelectionEvent event)<br />      {<br />      text.setText("click open menu!");<br />      }<br />   });<br /> </p>
		<p>5、使用工具栏toobar<br />建立工具栏可以通过如下方式：ToolBar toolbar = new ToolBar(shell, SWT.NONE);<br />在工具栏的基础之上创建工具栏子按钮，并且设置子按钮的标题：</p>
		<p>ToolItem item1 = new ToolItem(toolbar, SWT.PUSH);<br />item1.setText("item1");</p>
		<p>例如：<br />        ToolBar toolbar = new ToolBar(shell, SWT.NONE);<br />        ToolItem item1 = new ToolItem(toolbar, SWT.PUSH);<br />        item1.setText("item1");<br />        ToolItem item2 = new ToolItem(toolbar, SWT.PUSH);<br />        item2.setText("item2");</p>
		<p> </p>
		<p>工具栏的监听及事件<br />实例：创建一个监听对象，将该监听对象应用于每一个按钮，最终来判断鼠标点击的是哪一个按钮，效果图如下。<br />            Listener listener = new Listener( ) {<br />                public void handleEvent(Event event) {<br />                    ToolItem item =(ToolItem)event.widget;<br />                    String string = item.getText( );<br />                    text.setText("You selected:" + string);               }<br />            };<br />            item1.addListener(SWT.Selection, listener);<br />            item2.addListener(SWT.Selection, listener);<br />            item3.addListener(SWT.Selection, listener);<br />item4.addListener(SWT.Selection, listener);</p>
		<p> </p>
		<p>6、滚动条slider的使用<br />滚动条分为有边框、垂直、水平三种类型，利用slider.setBounds方法可以指定滚动条所在的位置。<br />滚动条所能够处理事件的包括：<br />SWT.ARROW_DOWN 向下或向右按钮被点击</p>
		<p>SWT.ARROW_UP 向左或向上按钮被点击</p>
		<p>SWT.DRAG  滑块按钮被托动</p>
		<p>SWT.END 滑块到达终点</p>
		<p>SWT.HOME 滑块到达起点</p>
		<p>SWT.PAGE_DOWN 下方或右侧的滚动条被点击</p>
		<p>SWT.PAGE_UP 上方或左侧的滚动条被点击<br />实例：根据滑块的位置移动按钮位置<br />        slider.addListener(SWT.Selection, new Listener( ) {</p>
		<p>          public void handleEvent(Event event) {</p>
		<p>            switch(event.detail) {</p>
		<p>               case SWT.ARROW_DOWN: button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>               case SWT.ARROW_UP:button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>               case SWT.DRAG:button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>               case SWT.END:button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>               case SWT.HOME:button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>               case SWT.PAGE_DOWN:button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>               case SWT.PAGE_UP:button.setBounds(slider.getSelection(),0,20,10); </p>
		<p>                        break;</p>
		<p>                    }<br />            }</p>
		<p>});</p>
		<p> </p>
		<p>
				<br />7、树形控件Tree <br />树形控件使用的方法为，首先创建一个Tree类型的对象，其次在该对象的基础之上继续扩展节点，以及扩展节点的子节点。<br />final Tree  tree = new Tree(shell, SWT.BORDER);<br />可以利用tree.setSize方法来改变树形控件的大小。在创建节点时，需要指明该节点所依赖的父节点的名称，如TreeItem item0 = new TreeItem(tree, 0);，那么item0将成为tree对象中的0级（顶级）节点。<br />如下程序将在tree对象的基础之上产生9个节点：<br />        final Tree tree = new Tree(shell, SWT.BORDER);</p>
		<p>        tree.setSize(290, 290);</p>
		<p>        for(int loopIndex1 = 2000; loopIndex1 &lt;= 2008; loopIndex1++) {</p>
		<p>            TreeItem item0 = new TreeItem(tree, 0);</p>
		<p>            item0.setText("Year " + loopIndex1);</p>
		<p>        }<br /> <br />在上述实例的基础上为每一个0级节点的基础上扩展出12个节点：<br />        for(int loopIndex1 = 2000; loopIndex1 &lt;= 2008; loopIndex1++) {</p>
		<p>            TreeItem item0 = new TreeItem(tree, 0);</p>
		<p>            item0.setText("Year " + loopIndex1);<br />            <br />            for(int loopIndex2 = 1; loopIndex2 &lt;= 12; loopIndex2++) {<br />            <br />            TreeItem item1 = new TreeItem(item0, 0);<br />            <br />            item1.setText("Month " + loopIndex2);<br />            }</p>
		<p>        }<br /> </p>
		<p>8、对话框dialog<br />对话框是一个依托于主窗体的子窗体，如图所示。<br /> <br />例如：当在主窗体中点击按钮时，弹出一个对话框dialog，当关闭对话框时按钮显示“dialog is disposed”<br /> <br />        Display display = new Display( );</p>
		<p>        final Shell shell = new Shell(display);</p>
		<p>        shell.setSize(300, 200);</p>
		<p>        shell.setText("main");<br />        <br />        final Button opener = new Button(shell, SWT.PUSH);</p>
		<p>        opener.setText("Click Me");<br />        <br />        opener.setBounds(20, 20, 50, 25);<br />        <br />        final Shell dialog = new Shell(shell, SWT.APPLICATION_MODAL |</p>
		<p>            SWT.DIALOG_TRIM);<br />        <br />        dialog.setText("dialog");<br />        <br />        dialog.setBounds(10,10,50,60);<br />        <br />        dialog.addDisposeListener(new DisposeListener(){<br />        <br />        public void widgetDisposed(DisposeEvent e){</p>
		<p>        opener.setText("dialog is disposed");<br />        <br />        }<br />        });<br />        <br />        Listener openerListener = new Listener( ) {</p>
		<p>            public void handleEvent(Event event) {</p>
		<p>                    dialog.open( );</p>
		<p>            }</p>
		<p>        };</p>
		<p>        opener.addListener(SWT.Selection, openerListener);<br />             <br />        shell.open( );<br />        <br />        while(!dialog.isDisposed( )) {</p>
		<p>            if(!display.readAndDispatch( )) display.sleep( );</p>
		<p>        }       </p>
		<p>        while (!shell.isDisposed( )) {</p>
		<p>            if (!display.readAndDispatch( ))</p>
		<p>                display.sleep( );</p>
		<p>        }</p>
		<p>        display.dispose( );<br /></p>
<img src ="http://www.blogjava.net/xixuui/aggbug/71967.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.blogjava.net/xixuui/" target="_blank">阿辉</a> 2006-09-26 14:14 <a href="http://www.blogjava.net/xixuui/archive/2006/09/26/71967.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>