本篇主要介紹如何在SWT下構建一個應用,如何安裝SWT Designer並破解已進行SWT的可視化編程,Display以及Shell為何物、有何用,SWT中的常用組件、面板容器以及事件模型等。
1.可視化環境搭建(SWT Designer):
(1).首先下載SWT Designer插件包SWT Designer 6.9.5 for Eclipse.rar;
(2).將解壓好的插件包extplugins\swt\eclipse下的features和plugins導入Myeclipse的dropins文件夾下
SWT Designer 6.9.5 for Eclipse.rar:
Myeclipse的dropins:
(3).下載個注冊機,激活全部可視化編程控件的使用(否則只能使用部分控件)
2.Display和Shell
編寫swt程序的步驟,這些步驟是:
(1). 創建一個Display對象
(2). 創建一個或者多個Shell對象,你可以認為Shell代表了程序的窗口。
(3). 在Shell內創建各種部件(widget)
(4). 對各個部件進行初始化(外觀,狀態等),同時為各種部件的事件創建監聽器(listener)
(5). 調用Shell對象的open()方法以顯示窗體
(6). 各種事件進行監聽並處理,直到程序發出退出消息
(7). 調用Display對象的dispose()方法以結束程序。
舉例:
public class TestText { public static void main(String[] args) { Display display = new Display(); // 創建一個display對象。 Shell shell = new Shell(display); // shell是程序的主窗體 shell.setText("文本框示例"); Text text1 = new Text(shell, SWT.NONE | SWT.BORDER);// 帶邊框 text1.setBounds(10, 10, 70, 30); Text text2 = new Text(shell, SWT.PASSWORD); text2.setBounds(90, 10, 70, 30); Text text3 = new Text(shell, SWT.MULTI | SWT.V_SCROLL | SWT.H_SCROLL); text3.setBounds(10, 50, 70, 70); Text text4 = new Text(shell, SWT.WRAP | SWT.V_SCROLL); text4.setBounds(90, 50, 70, 70); shell.pack(); shell.open(); while (!shell.isDisposed()) { // 如果主窗體沒有關閉則一直循環 if (!display.readAndDispatch()) { // 如果display不忙 display.sleep(); // 休眠 } } display.dispose(); // 銷毀display } }
Display是SWT的基礎類,負責在應用程序和本地操作系統之間建立交互;
一般一個應用程序只要一個Display即可,其用於啟動一個專有的線程,將執行事件循環,並且保持UI線程。
常用方法:getShells、getPrimaryMonitor等。
Shell是顯示在桌面上的窗口。可以是頂級窗口或是對話框。
樣式的調整通過構造函數進行設置,比如:Shell shell = new Shell(display, SWT.CLOSE)設置成只顯示關閉標志的Shell窗口。
如果要使用多個樣式,則需要可以使用“|”運算符進行疊加。
shell的繼承關系:
一個應用程序中可以創建一個或多個Shell
3.基本組件介紹
Widget:窗口小部件,Widget類是各種用戶界面元素如按鈕、列表、數和菜單整個繼承體系的父類,抽象類
Controls和Composites:在SWT中,操作系統控件被定義為抽象類Control的子類,如Button類,Text類等都是Control的子類。
每個控件都會有自己的父部件,這個父部件可以是Composite類或它的子類,shell也是Composite的子類。
SWT中控件體系的繼承關系為:
Button:Button分為普通按鈕(SWT.PUSH)、單選按鈕(SWT.RADIO)、多選按鈕(SWT.CHECK)、箭頭按鈕(SWT.ARROW)和切換按鈕(SWT.TOGGLE)
其樣式包括居中、居左等。
常用方法:setText、getSelect等
Label:分為文本標簽(SWT.NONE)、分割線標簽(SWT.SEPARATOR)
Text(文本框):單行、多行、包裹
其方法有:選中所有字符selectAll、顯示設置的選取文本showSelection、取消所有選擇clearSelection、將選取的字符串復制到剪貼板copy等
List(列表框):SWT.SINGLE(默認只能選中一個)、SWT.MULTI(可以選擇多行)
其方法有:添加選項add(String string)、remove(int index)刪除選項
Combo(組合框):下拉框
4.面板容器類
Composite(面板類):composite類繼承關系
Group(分組框):分組框是能夠顯示標題分組的面板類
TabFolder(選項卡):一個TabFolder與多個TabItem進行對應
常用方法:獲得選項卡數組getItems()、獲得當前選中的選項卡getSelection()等
CTabFolder(自定義選項卡):功能與TabFolder類似,但是樣式更加豐富,如:
final CTabFolder tabFolder = newCTabFolder(shell, SWT.CLOSE);
可以在每個TabItem上顯示關閉窗口。
SashForm(分割窗框):可以將屏幕的區域分成幾部分,並可以通過拖動窗框改變窗口的大小。
CBanner(自動以分割框):SashForm的變體,有3個控件,分別放在窗口的左側(left)、右側(right)、底部(bottom)。
ScrolledComposite(滾動面板)。
5.布局管理器
絕對定位:setBounds(int x, int y, int width, int height)
托管定位:
FillLayout(充滿時布局):組件大小相同,不能調節
RowLayout(行列式布局):可以調整邊距,不會等寬顯示組件,可以折行,設置控件大小RowData
GridLayout(網格式布局):設置單個控件的大小,使用GridData進行定制控件顯示
FormLayout(表格式布局):使用FormData和FormAttachment定制控件顯示
StackLayout(堆棧式布局)
6.事件模型
監聽器(Listener):接收事件發生的對象,負責處理事件到達后響應事件的代碼。監聽器對應是一個接口,要響應一個事件就要實現該接口中的方法。監聽器類的形式為XXXListener,XXX標示某一類型的監聽器。
Event(事件):當一個事件到達事件監聽對象時,要攜帶一些該事件所附加的一些信息。
注冊監聽器
適配器(這些都是基本概念,不了解的可以百度^_^)
鍵盤事件:e.character(表示輸入字符的Unicode編碼)、e.keyCode(按鍵所對應的ASCII代碼)、e.doit(是否繼續執行此事件,設置為false,則取消該事件)、e.stateMask(按下其他鍵的同時所使用的輔助鍵)
鍵盤事件舉例:
public class TestKeyListener { protected Shell shell; /** * Launch the application * @param args */ public static void main(String[] args) { try { TestKeyListener window = new TestKeyListener(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window */ public void open() { final Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } /** * Create contents of the window */ protected void createContents() { shell = new Shell(); shell.setSize(500, 375); shell.setText("SWT Application"); Button b = new Button(shell, SWT.PUSH|SWT.WRAP); b.setText("有本事,來點我"); b.setBounds(5, 5, 80, 30); b.addKeyListener(new KeyListener() { @Override public void keyReleased(KeyEvent arg0) { // TODO Auto-generated method stub } @Override public void keyPressed(KeyEvent arg0) { Control control = (Control)arg0.widget; Rectangle bounds = control.getBounds(); int bits = SWT.SHIFT|SWT.ALT|SWT.CTRL; if((arg0.stateMask & bits)!= 0){ arg0.doit = false;//取消該事件 return ; } if(arg0.keyCode == SWT.ARROW_DOWN) bounds.y++; else if(arg0.keyCode == SWT.ARROW_UP) bounds.y--; else if(arg0.keyCode == SWT.ARROW_LEFT) bounds.x--; else if(arg0.keyCode == SWT.ARROW_RIGHT) bounds.x++; if(arg0.character == 'a'){ System.out.println("您按下的是a鍵"); } control.setBounds(bounds); } }); // } }
鼠標事件:MouseEvent(雙擊)、MouseMoveEvent(移動)、MouseTrackEvent(跟蹤)
鼠標監聽事件舉例:
package com.cntrust.test.events; import org.eclipse.swt.SWT; import org.eclipse.swt.events.MouseEvent; import org.eclipse.swt.events.MouseListener; import org.eclipse.swt.events.MouseMoveListener; import org.eclipse.swt.events.MouseTrackListener; import org.eclipse.swt.graphics.Point; import org.eclipse.swt.graphics.Rectangle; import org.eclipse.swt.widgets.Button; import org.eclipse.swt.widgets.Control; import org.eclipse.swt.widgets.Display; import org.eclipse.swt.widgets.Shell; public class TestMouseListener { protected Shell shell; public Button b ; public Shell getShell() { return shell; } public void setShell(Shell shell) { this.shell = shell; } public Button getB() { return b; } public void setB(Button b) { this.b = b; } public MyMouseListener getMml() { return mml; } public void setMml(MyMouseListener mml) { this.mml = mml; } public static MyMouseListener mml ; /** * Launch the application * @param args */ public static void main(String[] args) { try { TestMouseListener window = new TestMouseListener(); window.open(); } catch (Exception e) { e.printStackTrace(); } } /** * Open the window */ public void open() { final Display display = Display.getDefault(); createContents(); shell.open(); shell.layout(); while (!shell.isDisposed()) { if (!display.readAndDispatch()) display.sleep(); } } /** * Create contents of the window */ protected void createContents() { shell = new Shell(); shell.setSize(500, 375); shell.setText("SWT Application"); b = new Button(shell, SWT.PUSH); b.setBounds(10, 10, 80, 30); b.setText("來,拖我一把"); mml = new MyMouseListener(); b.addMouseListener(mml); b.addMouseTrackListener(mml); // } public class MyMouseListener implements MouseMoveListener, MouseListener, MouseTrackListener{ @Override public void mouseMove(MouseEvent arg0) { Point point = Display.getCurrent().map(b, shell, arg0.x-10, arg0.y-10); Rectangle bounds = b.getBounds(); b.setBounds(point.x, point.y, bounds.width, bounds.height); } @Override public void mouseDoubleClick(MouseEvent arg0) { } @Override public void mouseDown(MouseEvent arg0) { b.addMouseMoveListener(mml); } @Override public void mouseUp(MouseEvent arg0) { b.removeMouseMoveListener(mml); } @Override public void mouseEnter(MouseEvent arg0) { } @Override public void mouseExit(MouseEvent arg0) { } @Override public void mouseHover(MouseEvent arg0) { } } }
如果覺得有用,歡迎點贊,可誠邀可視化朋友加入群227963113^_^
本文鏈接《可視化(番外篇)——SWT總結》
友情贊助
如果你覺得博主的文章對你那么一點小幫助,恰巧你又有想打賞博主的小沖動,那么事不宜遲,趕緊掃一掃,小額地贊助下,攢個奶粉錢,也是讓博主有動力繼續努力,寫出更好的文章^^。
1. 支付寶 2. 微信