在窗口系統中
程序一般都是以事件驅動的
SWT的Control類實現了一些事件監聽的注冊方法
其子類都可以通過這些方法注冊鼠標和鍵盤的監聽器
通過實現這些監聽器的接口
窗口組件就能響應相應的鼠標和鍵盤事件
Control類是窗口組件類的基類
它定義了基本的事件監聽方法
有如下一些
addControlListener
addFocusListener
addHelpListener
addKeyListener
addMouseListener
addMouseTrackListener
addMouseMoveListener
addPaintListener
addTraverseListener
添加事件監聽器步驟如下
創建事件監聽器例如new KeyListener()…
通過Control類的子類添加事件監聽器例如textaddKeyListener()
常用事件有鼠標事件鍵盤事件焦點事件窗口控制事件和選擇事件Control類的子類也可以定義添加相關的監聽方法
鼠標事件 在窗口系統中
鼠標基本上是必備的設備
一般來說
窗口中鼠標有鼠標單擊
鼠標雙擊
鼠標進入窗口
鼠標退出窗口及鼠標移動等事件
在SWT中
事件的響應是通過相應接口實現的
每個組件可以添加相應的事件響應實例來監聽事件
例如
button
addMouseListener(listener)
表示在button組件上添加鼠標的相應響應事件實例
其中
listener為實現監聽器對象
下面就具體的鼠標事件進行介紹
MouseListener接口 在SWT中
通過實現MouseListener接口來響應鼠標的按下
松開及雙擊事件
MouseListener接口如例程
所示
例程
MouseListener
java
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface MouseListener extends SWTEventListener {
public void mouseDoubleClick(MouseEvent e);
public void mouseDown(MouseEvent e);
public void mouseUp(MouseEvent e);
}
其中mouseDoubleClick表示鼠標雙擊事件響應方法mouseDown表示鼠標鍵按下事件的響應方法mouseUp表示鼠標鍵起來事件的響應方法MouseEvent為系統傳入的鼠標事件的參數MouseEvent中的button屬性表示鼠標的按鈕值例如ebutton等於表示鼠標左鍵按下按鈕值對應鼠標按鈕如表所示
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320045762.jpg)
在程序中開發人員可以根據ebutton的值判斷當前用戶按的是哪一個鼠標鍵從而確定采用什麼操作
MouseMoveListener接口
在SWT中通過實現MouseMoveListener接口來響應鼠標的移動事件MouseMoveListener接口如例程所示
例程 MouseMoveListenerjava
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface MouseMoveListener extends SWTEventListener {
public void mouseMove(MouseEvent e);
}
MouseMoveListener只有mouseMove方法用來響應窗口中鼠標移動事件
MouseTrackListener接口
在SWT中通過實現MouseTrackListener接口來響應鼠標進入窗口鼠標退出窗口和鼠標停放在窗口上的事件MouseTrackListener接口如例程所示
例程 MouseTrackListenerjava
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface MouseTrackListener extends SWTEventListener {
public void mouseEnter(MouseEvent e);
public void mouseExit(MouseEvent e);
public void mouseHover(MouseEvent e);
}
其中mouseEnter表示鼠標進入窗口事件的響應方法mouseExit表示鼠標退出窗口事件的響應方法mouseHover表示鼠標停放在窗口上事件的響應方法
鼠標事件實例
為了更深入地理解鼠標事件下面通過具體的實例演示如何響應鼠標事件該程序只是當事件觸發時簡單地打印出相應信息在具體的實例中讀者可以根據需要進行修改代碼如例程所示
例程 MouseEventExamplejava
/**
* 為了節省篇幅所有的import類已經被注釋
* 讀者可以通過ctrl+shift+o快捷鍵自動引入所依賴的類
* 如果有問題可發郵件到
* */
public class MouseEventExample implements MouseListener MouseMoveListener
MouseTrackListener {
//顯示信息的標簽
Label myLabel = null;
Shell shell = null;
public MouseEventExample() {
}
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
shellsetLayout(new GridLayout());
shellsetSize( );
shellsetText(Mouse Event Example);
myLabel = new Label(shell SWTBORDER);
myLabelsetText(I aint afraid of any old mouse);
//在當前窗口上添加鼠標響應事件
shelladdMouseListener(this);
shelladdMouseMoveListener(this);
shelladdMouseTrackListener(this);
shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch()) {
displaysleep();
}
}
displaydispose();
}
public static void main(String[] args) {
new MouseEventExample()run();
}
public void mouseDoubleClick(MouseEvent e) {
myLabelsetText(Double Click + ebutton + at: + ex + + ey);
Systemoutprintln(Double Click + ebutton + at: + ex +
+ ey);
}
public void mouseDown(MouseEvent e) {
myLabelsetText(Button + ebutton + Down at: + ex + + ey);
Systemoutprintln(Button + ebutton + Down at: + ex +
+ ey);
}
public void mouseUp(MouseEvent e) {
myLabelsetText(Button + ebutton + Up at: + ex + + ey);
Systemoutprintln(Button + ebutton + Up at: + ex + + ey);
}
public void mouseMove(MouseEvent e) {
myLabelsetText(Mouse Move at: + ex + + ey);
Systemoutprintln(Mouse Move at: + ex + + ey);
}
public void mouseEnter(MouseEvent e) {
myLabelsetText(Mouse Enter at: + ex + + ey);
Systemoutprintln(Mouse Enter at: + ex + + ey);
}
public void mouseExit(MouseEvent e) {
myLabelsetText(Mouse Exit at: + ex + + ey);
Systemoutprintln(Mouse Exit at: + ex + + ey);
}
public void mouseHover(MouseEvent e) {
myLabelsetText(Mouse Hover at: + ex + + ey);
Systemoutprintln(Mouse Hover at: + ex + + ey);
}
}
MouseEventExample類實現了MouseListenerMouseMoveListener和MouseTrackListener 個接口並通過shelladdMouseListener(this);shelladdMouseMoveListener(this);和shelladdMouseTrackListener(this);把自己作為監聽器添加到了窗口中程序運行效果如圖所示
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320045747.jpg)
圖 鼠標事件實例
鍵盤事件 鍵盤事件是最簡單
也是最常用的事件
一般來說
鍵盤事件有兩種
鍵按下和鍵松開
SWT通過KeyListener響應鍵盤事件
KeyListener接口 在SWT中
通過實現KeyListener接口來響應鍵按下和松開的事件
KeyListener接口如例程
所示
例程
KeyListener
java
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface KeyListener extends SWTEventListener {
public void keyPressed(KeyEvent e);
public void keyReleased(KeyEvent e);
}
其中keyPressed表示鍵按下事件的響應方法keyReleased表示鍵松開事件的響應方法KeyEvent為系統傳入的鍵盤事件的參數用戶可以通過KeyEvent參數找到相應的按鍵值
鍵盤事件實例
為了更深入地了解鍵盤事件下面通過具體的實例演示如何響應鍵盤事件該程序只是當事件觸發時簡單地打印出相應信息在具體的實例中讀者可以根據需要進行修改代碼如例程所示
例程 KeyListenerExamplejava
public class KeyListenerExample {
Display display;
Shell shell;
KeyListenerExample() {
display = new Display();
shell = new Shell(display);
shellsetSize( );
shellsetText(A KeyListener Example);
Text text = new Text(shell SWTBORDER);
textsetBounds( );
textaddKeyListener(new KeyListener() {
public void keyPressed(KeyEvent e) {
Systemoutprintln(key Pressed +echaracter);
}
public void keyReleased(KeyEvent e) {
Systemoutprintln(key Released +echaracter);
}
});
shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch())
displaysleep();
}
displaydispose();
}
public static void main(String[] args) {
new KeyListenerExample();
}
}
程序中通過匿名內部類實現監聽器這種方式在實例開發中會經常用到另外可以通過KeyEvent取得按鍵的值如上例的echaracter得到按鍵的字符程序運行效果如圖所示
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320045778.jpg)
圖鍵盤事件
焦點事件
在窗口系統中
當組件獲得輸入焦點或失去焦點時將觸發相應的事件
SWT通過FocusListener監聽焦點事件
FocusListener接口 在SWT中
通過實現FocusListener接口來響應獲得焦點和失去焦點的事件
FocusListener接口如例程
所示
例程
FocusListener
java
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface FocusListener extends SWTEventListener {
public void focusGained(FocusEvent e);
public void focusLost(FocusEvent e);
}
其中focusGained表示組件獲得焦點事件的響應方法focusLost表示組件失去焦點事件的響應方法FocusEvent為系統傳入的焦點事件的參數用戶可以通過FocusEvent參數找到相應的組件
焦點事件實例
為了更深入地理解焦點事件下面通過具體的實例演示如何響應焦點事件該程序只是簡單地改變當前獲得焦點和失去焦點組件的顯示信息在具體的實例中讀者可以根據需要進行修改代碼如例程所示
例程 FocusListenerExamplejava
public class FocusListenerExample {
public static void main(String[] args) {
Display display = new Display();
Shell shell = new Shell(display);
shellsetLayout(new GridLayout( true));
shellsetText(One Potato Two Potato);
//新建焦點監聽器
FocusListener listener = new FocusListener() {
public void focusGained(FocusEvent event) {
//獲得觸發事件的組件
Button button = (Button) eventgetSource();
//焦點獲得時改變顯示文本
buttonsetText(Im It!);
}
public void focusLost(FocusEvent event) {
//獲得觸發事件的組件
Button button = (Button) eventgetSource();
//焦點獲得時改變顯示文本
buttonsetText(Pick Me!);
}
};
for (int i = ; i < ; i++) {
Button button = new Button(shell SWTPUSH);
buttonsetLayoutData(new GridData(GridDataFILL_HORIZONTAL));
buttonsetText(Pick Me!);
buttonaddFocusListener(listener);
}
shellpack();
shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch()) {
displaysleep();
}
}
displaydispose();
}
}
程序中顯示了個按鈕並為按鈕添加上了焦點監聽器程序運行效果如圖所示
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320045759.jpg)
圖 焦點事件實例
窗口控制事件
在窗口系統中
當組件被移動或改變大小時將觸發相應的事件
SWT通過ControlListener監聽窗口控制事件
ControlListener接口 在SWT中
通過實現ControlListener接口來響應組件被移動或改變大小的事件
ControlListener接口如例程
所示
例程
ControlListener
java
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface ControlListener extends SWTEventListener {
public void controlMoved(ControlEvent e);
public void controlResized(ControlEvent e);
}
其中controlMoved表示組件被移動事件的響應方法controlResized表示組件被改變大小事件的響應方法ControlEvent為系統傳入的窗口控制事件的參數用戶可以通過ControlEvent參數找到相應的組件
窗口控制事件實例
為了更深入地理解窗口控制事件下面通過具體的實例演示如何響應窗口控制事件該程序只是簡單地打印組件被移動或改變大小的信息在具體的實例中讀者可以根據需要進行修改代碼如例程所示
例程 ControlListenerExamplejava
public class ControlListenerExample {
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
shelladdControlListener(new ControlListener() {
public void controlMoved(ControlEvent e) {
Systemoutprintln(control move);
}
public void controlResized(ControlEvent e) {
Systemoutprintln(control resize);
}
}
);
shellpack();
shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch()) {
displaysleep();
}
}
displaydispose();
}
public static void main(String[] args) {
new ControlListenerExample()run();
}
}
上例顯示的只是一個空白的窗口當用戶移動窗口或改變窗口大小時將會觸發監聽器所實現的事件
選擇事件 SWT的很多組件都實現了選擇組件事件的監聽機制
例如按鈕
菜單項的選擇
當選擇了相關的菜單項或組件時
將觸發相應的事件
SelectionListener接口
在SWT中
通過實現SelectionListener接口來響應選擇組件事件
SelectionListener接口如例程
所示
例程
SelectionListener
java
package orgeclipseswtevents;
import orgeclipseswtinternalSWTEventListener;
public interface SelectionListener extends SWTEventListener {
public void widgetSelected(SelectionEvent e);
public void widgetDefaultSelected(SelectionEvent e);
}
其中widgetSelected表示組件被選擇事件的響應方法widgetDefaultSelected表示組件默認選擇事件的響應方法SelectionEvent為系統傳入的選擇事件的參數
選擇組件事件實例
為了更深入地理解選擇組件事件下面通過具體的實例演示如何響應選擇組件事件該程序只是簡單地打印組件被移動或改變大小的信息在具體的實例中讀者可以根據需要進行修改代碼如例程所示
例程 SelectonListenerExamplejava
public class SelectonListenerExample {
public static void main(String[] args) {
Display display = new Display();
final Shell mainShell = new Shell(display);
Button button = new Button(mainShell SWTPUSH);
buttonsetText(Close Me!);
buttonsetBounds( );
// 添加選擇組件事件
buttonaddSelectionListener(new SelectionListener() {
public void widgetSelected(SelectionEvent event) {
Systemoutprintln(select button);
mainShellclose();
}
public void widgetDefaultSelected(SelectionEvent e) {
// 不執行任何操作
}
});
mainShellopen();
while (!mainShellisDisposed()) {
if (!displayreadAndDispatch()) {
displaysleep();
}
}
displaydispose();
}
}
上例中只是添加了一個按鈕當選擇按鈕時關閉當前窗口
其他常用事件
SWT中為了實現特定的功能很多組件都提供了特定事件的響應本節將通過實例介紹HelpListenerVerifyListener和ModifyListener 個特定的事件監聽器
HelpListenerVerifyListener和ModifyListener監聽器的功能
HelpListener監聽器通過helpRequested(HelpEvent e)方法響應用戶的幫助請求事件當用戶在組件獲得焦點後按【F】鍵將觸發此事件
VerifyListener監聽器通過verifyText(VerifyEvent e)方法響應校驗輸入事件此監聽器只對文本輸入校驗當用戶輸入了數據後verifyText方法將通過設置VerifyEvent中的doit屬性判斷輸入是否正確從而確定修改是否有效doit屬性為true時修改有效即edoit = true;
ModifyListener監聽器通過modifyText(ModifyEvent e)方法響應文本被修改的事件此監聽器只對文本輸入校驗
提示如果VerifyListener監聽器和ModifyListener監聽器同時存在的話會先響應校驗輸入事件如果校驗成功再響應修改事件
HelpListenerVerifyListener和ModifyListener監聽器實例
在此實例中用戶可以輸入華氏溫度和攝氏溫度通過監聽器判斷輸入是否正確及計算相應的攝氏溫度和華氏溫度另外還可以按【F】鍵獲得當前組件的信息代碼如例程所示
例程 MultipleListenersExamplejava
public class MultipleListenersExample implements HelpListener VerifyListener
ModifyListener {
private static final double FIVE_NINTHS = / ;
private static final double NINE_FIFTHS = / ;
private Text fahrenheit;
private Text celsius;
private Label help;
public void run() {
Display display = new Display();
Shell shell = new Shell(display);
shellsetText(Temperatures);
createContents(shell);
shellpack();
shellopen();
while (!shellisDisposed()) {
if (!displayreadAndDispatch()) {
displaysleep();
}
}
displaydispose();
}
private void createContents(Shell shell) {
shellsetLayout(new GridLayout( true));
new Label(shell SWTLEFT)setText(Fahrenheit:);
fahrenheit = new Text(shell SWTBORDER);
GridData data = new GridData(GridDataFILL_HORIZONTAL);
datahorizontalSpan = ;
fahrenheitsetLayoutData(data);
fahrenheitsetData(Type a temperature in Fahrenheit);
// 為華氏溫度文本框添加監聽器
fahrenheitaddHelpListener(this);
fahrenheitaddVerifyListener(this);
fahrenheitaddModifyListener(this);
new Label(shell SWTLEFT)setText(Celsius:);
celsius = new Text(shell SWTBORDER);
data = new GridData(GridDataFILL_HORIZONTAL);
datahorizontalSpan = ;
celsiussetLayoutData(data);
celsiussetData(Type a temperature in Celsius);
//為攝氏溫度文本框添加監聽器
celsiusaddHelpListener(this);
celsiusaddVerifyListener(this);
celsiusaddModifyListener(this);
help = new Label(shell SWTLEFT | SWTBORDER);
data = new GridData(GridDataFILL_HORIZONTAL);
datahorizontalSpan = ;
helpsetLayoutData(data);
}
//響應幫助事件
public void helpRequested(HelpEvent event) {
helpsetText((String) eventwidgetgetData());
}
//響應校驗事件
public void verifyText(VerifyEvent event) {
eventdoit = false;
char myChar = eventcharacter;
String text = ((Text) eventwidget)getText();
if (myChar == && textlength() == ) eventdoit = true;
if (CharacterisDigit(myChar)) eventdoit = true;
if (myChar == \b) eventdoit = true;
}
//響應文本修改的事件
public void modifyText(ModifyEvent event) {
// 刪除監聽器從而在modifyText過程中不會觸發事件
celsiusremoveVerifyListener(this);
celsiusremoveModifyListener(this);
fahrenheitremoveVerifyListener(this);
fahrenheitremoveModifyListener(this);
Text text = (Text) eventwidget;
try {
int temp = IntegerparseInt(textgetText());
if (text == fahrenheit) {
celsiussetText(StringvalueOf((int) (FIVE_NINTHS * (temp ))));
} else {
fahrenheitsetText(StringvalueOf((int) (NINE_FIFTHS * temp + )));
}
} catch (NumberFormatException e) { /* Ignore */ }
//添加監聽器
celsiusaddVerifyListener(this);
celsiusaddModifyListener(this);
fahrenheitaddVerifyListener(this);
fahrenheitaddModifyListener(this);
}
public static void main(String[] args) {
new MultipleListenersExample()run();
}
}
程序運行效果如圖所示
![](http://tw.wingwit.com/Article/UploadFiles/201311/2013112320045734.jpg)
圖 文本監聽器
提示一般來說監聽器都有一個抽象的Adaper類實現監聽器的方法例如FocusAdapter實現了FocusListener的方法(方法為空)如果讀者不想實現監聽器的全部方法則可以繼承監聽器的Adaper類否則要實現監聽器接口的所有方法
From:http://tw.wingwit.com/Article/program/Java/ky/201311/27909.html