kooyee ‘s blog

          開源軟件, 眾人努力的結(jié)晶, 全人類的共同財富
          posts - 103, comments - 55, trackbacks - 0, articles - 66
             :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          『SWT』SWT/JFace的基本介紹

          Posted on 2008-06-09 18:35 kooyee 閱讀(2116) 評論(0)  編輯  收藏 所屬分類: GUI骨衣
          SWT/JFace的基本介紹

          1.1 Face與其他圖形界面設(shè)計工具的比較

          Java圖形界面實現(xiàn)方式有很多,比如AWTSWINGSWT等。AWTSWING不論是在速度上還是美觀上都有很大的不足;對于比較龐大而復(fù)雜的系統(tǒng),用AWTSWING相很難實現(xiàn),因為運行的速度會相當(dāng)?shù)穆?/span>SWT直接使用操作系統(tǒng)提供的本地圖形接口,具備本地化的Look & Feel,效率高且美觀。因此,本項目選擇SWT作為圖形界面開發(fā)基礎(chǔ)工具包。

          2-1SWT原理圖,圖2-2JFace原理圖

          2-1

                            2-2

           

          SWTWin32API簡單的包裝了一下,系統(tǒng)在SWT這一層調(diào)用的方法、傳遞的參數(shù)被原封不動的代理到了Win32層。這是SWT的核心思想。SWT有一個很重要的設(shè)計原則,那就是,SWTAPI一對一的封裝OSAPI,完全忠實于操作系統(tǒng)的API實現(xiàn)的行為,如果有bug,那也是OSbug,它不會嘗試去“糾正”操作系統(tǒng),因為那樣會潛在的破壞本地化的一些行為。忠實于OS也使得調(diào)用者不必但心自己的SWT程序會跟OS的本地GUI有不一致的地方。因此,SWT擁有標準的與操作系統(tǒng)相同的外觀,幾乎沒有人能看出你的程序是用Java寫出來的,更為重要的是,其程序運行的效率可以和VC++寫出的程序向媲美,而且開發(fā)的效率也不在AWT/SWING之下。

           

          1.2 如何創(chuàng)建簡單的SWT/JFace程序

          1.2.1如何在Eclipse中建立一個SWT/JFace工程

          依次File→New→other 就會看到

          選它

          然后按向?qū)虏僮骷纯尚陆ㄒ粋€SWT/JFace工程,該工程跟其他的Jave工程沒有多大的區(qū)別

          1.2.2一個簡單的HelloWorld小例子

          publicclass HelloWorld{

              publicstaticvoid main(String[] args){

                 Display display=new Display();

                 Shell shell=new Shell(display,SWT.V_SCROLL|SWT.SHELL_TRIM);

                

                 shell.setText("This is my label");

                 shell.setBounds(100,100,500,200);

                 shell.setLayout(new FillLayout());

                

                 //Color red=new Color(display,255,0,0);

                

                 Label label1=new Label(shell,SWT.CENTER);

                 label1.setText("Hello word");

                 label1.setLocation(100,100);

                 label1.setBackground(new Color(display,0,200,0));

                 new Label(shell,SWT.CENTER).setText("software college of neu");

                

                

                 shell.open();

                 while(!shell.isDisposed()){

                 if(!display.readAndDispatch())

                 display.sleep();

                 }

                 display.dispose();

                

              }

          }

           

          程序的一些解釋:

          1.       Display類:該類是SWT的基礎(chǔ)類,它負責(zé)應(yīng)用程序和本地操作系統(tǒng)之間建立交互。Display類是從Decive繼承而來。

          Display繼承關(guān)系圖

          2.       Shell類:該類是顯示在桌面上的窗口,可以使頂級窗口(Top Level Shells)或者是對話框窗口(Secondary Or Dialog Shells

          3.       設(shè)置消息循環(huán)進行監(jiān)聽,以便監(jiān)聽到界面的操作:

          while(!shell.isDisposed()){

              if(!display.readAndDispatch())

                 display.sleep();

          }

           

           

           

           

           

          二.      SWT基礎(chǔ)

          2.1 SWT基本組件

          2.1.1關(guān)于按鈕Button

          類型

          特點

          創(chuàng)建代碼舉例

          普通

          呈突出狀

          Button bt = new Button(shell,SWT.PUSH)

          切換

          單擊后保持按下狀態(tài),再次單擊時恢復(fù)。

          Button bt = new Button(shell,SWT.TOGGLE)

          箭頭

          按鈕帶有小箭頭

          Button bt = new Button(shell , SWT.ARROW|SWT.UP)向上的箭頭

          單選

          同一組只有一個選中

          Group group = new Group(shell , SWT.SHADOW_ETCHED_OUT)

          group.setLayout(new FillLayout(SWT.VERTICAL)

          Button bt1 = new Button(group , SWT.RADIO|SWT.LEFT)

          Button bt2 = new Button(group, SWT.RADIO|SWT.RIGHT)

           

          bt1.setSelection(true)表示選定該按鈕

          多選

          同時可選幾個按鈕

          Group group = new Group(shell , SWT.SHADOW_ETCHED_OUT)

          group.setLayout(new FillLayout(SWT.VERTICAL)

          Button bt1 = new Button(group , SWT.CHECK|SWT.LEFT)

          Button bt2 = newButton(group, SWT.CHECK|SWT.RIGHT)

           

          bt1.setSelection(true)表示選定該按鈕

           

          2.1.2文本框Text

          文本框是一個比較常用的組件,文本狂本身就支持復(fù)制,粘貼,刪除等基本的操作。因此這些常用的基本操作不用我們再去設(shè)計。

          1.文本框的比較特殊的樣式

          樣式常量

          描述

          SWT.READ_ONLY

          只讀文本框

          SWT.PASSWORD

          輸入密碼框

          SWT.MULTI

          可以輸入多行的文本框

          SWT.WRAP

          可以輸入多行并且自動切換

          SWT.H_SCROLL

          帶水平滾動條的文本框

           

          2.關(guān)于文本框的幾個操作的方法

           

          設(shè)置文字的方向

          setOrientation(int orientation)

          SWT.RIGHT_TO_LEFT

          則從右往左填充

          設(shè)置文本輸入字符的格式

          setEchoChar(char echo)

          Example:setEchoChar(“*”),輸入時則顯示“*

          設(shè)置Tab退格的字符數(shù)

          setTabs(int tabs)

          tabs是多大就退幾格

          全選

          selectAll()

           

          取消所有選擇

          clearSelection()

           

          將所選的字符復(fù)制到剪貼板

          copy()

           

          將所選的字符剪切到剪貼板

          cut()

           

          將剪貼板上的字符粘貼到文本框

          paste()

           

           

          2.2面板容器類

          2.2.1自定義選項卡CTabFolder

          自定義選項卡比TabFolder類的功能強大,我們可以給他添加一些最大化最小化的按鈕,可以做出仿eclipse編輯區(qū)的選項卡;

          ①.     帶有關(guān)閉的選項卡;初始化時將風(fēng)格設(shè)置為SWT.CLOSE即可;

          CTabFolder tabFolder = new CTabFolder(shell,SWT.CLOSE);

          ②.     帶有最大化最小化按鈕

           

          tabFolder.setMaxmizeVisible(true);//顯示最大化按鈕

           

          tabFolder.setMininizeVisible(true);//顯示最小化按鈕

          ③.     設(shè)置選項卡(選中狀態(tài)標簽)的背景和顏色

          l         單一的前景色和背景色

          tabFolder.setSelectionForeground(display.getSystemColor(SWT.COLOR_WHITE));

          tabFolder.setSelectionBackground(display.getSystemColor(SWT.COLOR_BLUE));

          l         漸變的背景色

          設(shè)置漸變背景的方法是setSelectionBackground(Color[] color, int[] percents)setSelectionBackground(Color[] color, int[] percents, Boolean vertical),第二個方法的vertical表示是否垂直漸變;

           

          Color[] color = new Color[4];

          color[0] = display.getSystemColor(SWT.COLOR_DARK_BLUE);

          color[1] = display.getSystemColor(SWT.COLOR_BLUE);

          color[2] = display.getSystemColor(SWT.COLOR_WHITE);

          color[3] = display.getSystemColor(SWT.COLOR_WHITE);

          int[] intArray = newint[]{25, 50, 100};

          tabFolder.setSelectionBackground(color,intArray);

          l         設(shè)置背景圖片,setSelectionBackground(Image image)

          ④.     最大化最小化按鈕的監(jiān)聽;

          添加監(jiān)聽的語句是

          tabFolder.addCTabFolder2Listener(new CTabFolder2Adapter(){});

          設(shè)置最大化,最小化和還原,實現(xiàn)以下方法

                 publicvoid mimimize(CTabFolderEvent e){}

                 publicvoid maximize(CTabFolderEvent e){}

                 publicvoid restore(CTabFolderEvent e){}

          以下是最下化方法的代碼  

             

          tabFolder.setMinimized(true);//設(shè)置選項卡為最小化,決定了右上角的按鈕

          tabFolder.setLayoutData(new GridData(SWT.FILL, SET.FILL, true, false));//改變布局,呈現(xiàn)最小化狀態(tài)

          shell.layout(true);//刷新布局,否則新的布局不能呈現(xiàn)出來

           

          ⑤.     CTabFolder還有許多有用的方法,以上說的基本上可以構(gòu)建出仿eclipse的選項卡了

           

          2.2.2滾動面板ScrolledComposite

          對于滾動面板ScrolledComposite,看起來好像很好用,如果對于布局確定的面板來說,實現(xiàn)滾動效果確實比較簡單,但對于一個沒有確定布局的面板(比如一個可以往上面隨意家圖形的畫布),那實現(xiàn)起來就要費一些心思。這里我們要實現(xiàn)一個沒有確定布局的,可以隨意添加圖形的而且要求可以無限變大的面板。

          l       首先,我們新建一個ScrolledComposite sc,然后將我們的畫布canvas設(shè)為ScrolldeComposite的內(nèi)容sc.setContent(canvas);為了讓滾動條顯示出來,我們可以canvas設(shè)置一個適當(dāng)?shù)拇笮?/span>

          l       接下來最關(guān)鍵的是如何改變面板的大小,在改變大小之前,我們首先要判斷出面板是否到了邊界,因為這時才需要使面板的大小增大

          (sc.getVerticalBar().getSize().y+sc.getVerticalBar().getSelection())

          ==sc.getVerticalBar().getMaximum())

           

          如果等式成立就說明面板已經(jīng)到了邊界

          l       這時只要在監(jiān)聽里重新設(shè)置面板的大小就可以了

           

           

          2.2.3分割窗框SashForm

          關(guān)于分割框的基本知識這里就不再介紹了,在這里主要講述使用分割框和選項卡實現(xiàn)最大化和還原,其實這也很簡單,只要用了setMaximizedControl(Control control)這個方法就可以了。

          在我們點擊選項卡的最大化時:

          form.setMaximizedControl(folder);

          最大化后填充的分割框

          需要設(shè)為最大化的組件

          在點擊還原是只要form.setMaximizedControl(null);整個面板就會還原到初始的比例 
          主站蜘蛛池模板: 惠东县| 黑河市| 塘沽区| 台江县| 沂水县| 布尔津县| 清苑县| 临汾市| 南江县| 泰顺县| 宁波市| 娄烦县| 天峻县| 东安县| 来安县| 屏东市| 克什克腾旗| 济宁市| 新宾| 长垣县| 邵武市| 隆安县| 突泉县| 五华县| 玛沁县| 岳西县| 石泉县| 丹阳市| 沅陵县| 桂东县| 西乡县| 理塘县| 会泽县| 麻江县| 胶南市| 克东县| 阳曲县| 克拉玛依市| 革吉县| 通榆县| 东乡|