熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java開源技術 >> 正文

Eclipse開發經典教程:SWT事件

2013-11-23 20:04:57  來源: Java開源技術 
在窗口系統中程序一般都是以事件驅動的SWT的Control類實現了一些事件監聽的注冊方法其子類都可以通過這些方法注冊鼠標和鍵盤的監聽器通過實現這些監聽器的接口窗口組件就能響應相應的鼠標和鍵盤事件
Control類是窗口組件類的基類它定義了基本的事件監聽方法有如下一些

  addControlListener addFocusListener addHelpListener addKeyListener addMouseListener addMouseTrackListener addMouseMoveListener addPaintListener addTraverseListener

  添加事件監聽器步驟如下
創建事件監聽器例如new KeyListener()…
通過Control類的子類添加事件監聽器例如textaddKeyListener()

常用事件有鼠標事件鍵盤事件焦點事件窗口控制事件和選擇事件Control類的子類也可以定義添加相關的監聽方法



 
鼠標事件

在窗口系統中鼠標基本上是必備的設備一般來說窗口中鼠標有鼠標單擊鼠標雙擊鼠標進入窗口鼠標退出窗口及鼠標移動等事件

在SWT中事件的響應是通過相應接口實現的每個組件可以添加相應的事件響應實例來監聽事件例如buttonaddMouseListener(listener)表示在button組件上添加鼠標的相應響應事件實例其中listener為實現監聽器對象下面就具體的鼠標事件進行介紹

MouseListener接口

在SWT中通過實現MouseListener接口來響應鼠標的按下松開及雙擊事件MouseListener接口如例程所示
例程 MouseListenerjava

  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等於表示鼠標左鍵按下按鈕值對應鼠標按鈕如表所示

  

  在程序中開發人員可以根據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);把自己作為監聽器添加到了窗口中程序運行效果如圖所示

  
鼠標事件實例


 


 
 
鍵盤事件

鍵盤事件是最簡單也是最常用的事件一般來說鍵盤事件有兩種鍵按下和鍵松開SWT通過KeyListener響應鍵盤事件

KeyListener接口

在SWT中通過實現KeyListener接口來響應鍵按下和松開的事件KeyListener接口如例程所示
例程 KeyListenerjava

  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得到按鍵的字符程序運行效果如圖所示

  

  圖鍵盤事件
   

                                                                               


焦點事件

在窗口系統中當組件獲得輸入焦點或失去焦點時將觸發相應的事件SWT通過FocusListener監聽焦點事件

FocusListener接口

在SWT中通過實現FocusListener接口來響應獲得焦點和失去焦點的事件FocusListener接口如例程所示
例程 FocusListenerjava

  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(); } }

  程序中顯示了個按鈕並為按鈕添加上了焦點監聽器程序運行效果如圖所示

  
焦點事件實例



 


 
窗口控制事件

在窗口系統中當組件被移動或改變大小時將觸發相應的事件SWT通過ControlListener監聽窗口控制事件

ControlListener接口

在SWT中通過實現ControlListener接口來響應組件被移動或改變大小的事件ControlListener接口如例程所示

例程 ControlListenerjava

  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接口如例程所示
例程 SelectionListenerjava

  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(); } }

  程序運行效果如圖所示

  
文本監聽器

  提示一般來說監聽器都有一個抽象的Adaper類實現監聽器的方法例如FocusAdapter實現了FocusListener的方法(方法為空)如果讀者不想實現監聽器的全部方法則可以繼承監聽器的Adaper類否則要實現監聽器接口的所有方法


From:http://tw.wingwit.com/Article/program/Java/ky/201311/27909.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.