GWT提供了一個類似於Java AWT或SWING用戶界面框架的事件處理程序模型。
監聽器接口定義了一個或多個小部件調用以宣布事件的方法。GWT提供了對應於各種可能事件的接口列表。
希望接收特定類型事件的類實現關聯的處理程序接口,然後將對自身的引用傳遞給小部件以訂閱一組事件。
例如,按鈕類發布單擊事件,因此您必須編寫一個類來實現單擊處理程序來處理單擊事件。
Event Handler Interfaces
所有GWT事件處理程序都從event handler接口擴展而來,每個處理程序只有一個帶有單個參數的方法。此參數始終是關聯事件類型的對象。每個事件對象都有許多方法來操作傳遞的事件對象。例如,對於click事件,您必須按以下方式編寫處理程序−
/** * create a custom click handler which will call * onClick method when button is clicked. */ public class MyClickHandler implements ClickHandler { @Override public void onClick(ClickEvent event) { Window.alert("Hello World!"); } }
現在,任何希望接收click事件的類都將調用addClickHandler()來註冊一個事件處理程序,如下所示−
/** * create button and attach click handler */ Button button = new Button("Click Me!"); button.addClickHandler(new MyClickHandler());
每個支持事件類型的小部件都有一個HandlerRegistration addFoo處理程序(Foo事件)的方法,其中Foo是實際的事件,如單擊、錯誤、按鍵等。
下面是重要的GWT事件處理程序和相關事件以及處理程序註冊方法的列表;
Sr.No. | Event Interface | Event Method & Description |
---|---|---|
1 | Before Selection Handler<I> |
選擇前無效(選擇事件前<I>事件) 在啓動BeforeSelectionEvent時調用。 |
2 | BlurHandler |
void on blur( 在啓動模糊事件時調用。 |
3 | ChangeHandler |
更改時無效(ChangeEvent事件) 在激發更改事件時調用。 |
4 | ClickHandler |
單擊即作廢(ClickEvent事件) 在激發本機單擊事件時調用。 |
5 | CloseHandler<T> |
關閉時無效(關閉事件<T>事件) 在啓動CloseEvent時調用。 |
6 | Context Menu Handler |
Void on context menu( 在激發本機上下文菜單事件時調用。 |
7 | Double Click Handler |
Void on double click( 在觸發雙擊事件時調用。 |
8 | Error Handler |
出錯時無效(錯誤事件事件) 在觸發錯誤事件時調用。 |
9 | Focus Handler |
焦點無效(焦點事件事件) 啓動焦點事件時調用。 |
10 | Form Panel.Submit Complete Handler |
提交完成時作廢(表單面板。提交完整事件事件) 成功提交表單時激發。 |
11 | FormPanel.SubmitHandler |
提交時無效(表單面板。提交事件事件事件) 提交表單時激發。 |
12 | Key Down Handler |
void on key down(>key down event event) 在觸發KeyDownEvent時調用。 |
13 | KeyPressHandler |
void on keypress( 在啓動KeyPressEvent時調用。 |
14 | KeyUpHandler |
void on keyup( 在觸發KeyUpEvent時調用。 |
15 | LoadHandler |
加載時無效(LoadEvent事件) 在啓動LoadEvent時調用。 |
16 | MouseDownHandler |
MouseDown上的void(MouseDown event事件) 當MouseDown被解僱時調用。 |
17 | MouseMoveHandler |
MouseMove上的void(mousemovevent事件) 當MouseMoveEvent被激發時調用。 |
18 | MouseOutHandler |
MouseOut上的void(MouseOut event事件) 當MouseOutEvent被觸發時調用。 |
19 | MouseOverHandler |
MouseOver時無效(MouseOver event事件) 在觸發MouseOverEvent時調用。 |
20 | MouseUpHandler |
MouseUp上的void(MouseUp event事件) 當MouseUpEvent被解僱時調用。 |
21 | MouseWheelHandler |
滑鼠滾輪上的空白(滑鼠滾輪事件事件) 當mouseweelevent被激發時調用。 |
22 | ResizeHandler |
調整大小時無效(ResizeEvent事件) 調整小部件大小時激發。 |
23 | ScrollHandler |
void on scroll( 在觸發ScrollEvent時調用。 |
24 | SelectionHandler<I> |
選擇無效(SelectionEvent<I>事件) 在啓動SelectionEvent時調用。 |
25 | ValueChangeHandler<I> |
值更改時無效(ValueChangeEvent<I>事件) 在觸發ValueChangeEvent時調用。 |
26 | Window.ClosingHandler |
窗口關閉時無效(Window.ClosingEvent事件) 在瀏覽器窗口關閉或導航到其他站點之前激發。 |
27 | Window.ScrollHandler |
WindowScroll上的void(Window.ScrollEvent事件) 在滾動瀏覽器窗口時激發。 |
Event Methods
如前所述,每個處理程序都有一個帶有單個參數的方法來保存事件對象,例如void onClick(ClickEvent event)或void onKeyDown(keydownext event)。像ClickEvent和KeyDownEvent這樣的事件對象很少有下面列出的常用方法−
Sr.No. | Method & Description |
---|---|
1 |
protected void dispatch(ClickHandler handler)此方法只能由HandlerManager調用 |
2 |
doEvent.Type<FooHandler>getAssociatedType()此方法返回用於註冊Foo事件的類型。 |
3 |
static DomEvent.Type<FooHandler>getType()此方法獲取與Foo事件關聯的事件類型。 |
4 |
public java.lang.Object getSource()此方法返回上次觸發此事件的源。 |
5 |
protected final boolean is live()此方法返回事件是否處於活動狀態。 |
6 |
protected void kill()此方法終止事件 |
Example
本例將引導您通過簡單的步驟來展示如何在GWT中使用aClick事件和KeyDown事件處理。按照以下步驟更新我們在GWT-Create application−一章中創建的GWT應用程式;
Step | Description |
---|---|
1 | Create a project with a name HelloWorld under a package com.tutorialspoint as explained in the GWT - Create Application chapter. |
2 | Modify HelloWorld.gwt.xml, HelloWorld.css, HelloWorld.html and HelloWorld.java as explained below. Keep rest of the files unchanged. |
3 | Compile and run the application to verify the result of the implemented logic. |
下面是修改後的模塊描述符的內容。
<?xml version = "1.0" encoding = "UTF-8"?> <module rename-to = 'helloworld'> <!-- Inherit the core Web Toolkit stuff. --> <inherits name = 'com.google.gwt.user.User'/> <!-- Inherit the default GWT style sheet. --> <inherits name = 'com.google.gwt.user.theme.clean.Clean'/> <!-- Specify the app entry point class. --> <entry-point class = 'com.tutorialspoint.client.HelloWorld'/> <!-- Specify the paths for translatable code --> <source path = 'client'/> <source path = 'shared'/> </module>
下面是修改後的樣式表文件war/HelloWorld.css的內容。
body { text-align: center; font-family: verdana, sans-serif; } h1 { font-size: 2em; font-weight: bold; color: #777777; margin: 40px 0px 70px; text-align: center; }
下面是修改後的HTML宿主文件war/HelloWorld.HTML的內容。
<html> <head> <title>Hello World</title> <link rel = "stylesheet" href = "HelloWorld.css"/> <script language = "javascript" src = "helloworld/helloworld.nocache.js"> </script> </head> <body> <h1>Event Handling Demonstration</h1> <div id = "gwtContainer"></div> </body> </html>
package com.tutorialspoint.client; import com.google.gwt.core.client.EntryPoint; import com.google.gwt.event.dom.client.ClickEvent; import com.google.gwt.event.dom.client.ClickHandler; import com.google.gwt.event.dom.client.KeyCodes; import com.google.gwt.event.dom.client.KeyDownEvent; import com.google.gwt.event.dom.client.KeyDownHandler; import com.google.gwt.user.client.Window; import com.google.gwt.user.client.ui.Button; import com.google.gwt.user.client.ui.DecoratorPanel; import com.google.gwt.user.client.ui.HasHorizontalAlignment; import com.google.gwt.user.client.ui.RootPanel; import com.google.gwt.user.client.ui.TextBox; import com.google.gwt.user.client.ui.VerticalPanel; public class HelloWorld implements EntryPoint { public void onModuleLoad() { /** * create textbox and attach key down handler */ TextBox textBox = new TextBox(); textBox.addKeyDownHandler(new MyKeyDownHandler()); /* * create button and attach click handler */ Button button = new Button("Click Me!"); button.addClickHandler(new MyClickHandler()); VerticalPanel panel = new VerticalPanel(); panel.setSpacing(10); panel.setHorizontalAlignment(HasHorizontalAlignment.ALIGN_CENTER); panel.setSize("300", "100"); panel.add(textBox); panel.add(button); DecoratorPanel decoratorPanel = new DecoratorPanel(); decoratorPanel.add(panel); RootPanel.get("gwtContainer").add(decoratorPanel); } /** * create a custom click handler which will call * onClick method when button is clicked. */ private class MyClickHandler implements ClickHandler { @Override public void onClick(ClickEvent event) { Window.alert("Hello World!"); } } /** * create a custom key down handler which will call * onKeyDown method when a key is down in textbox. */ private class MyKeyDownHandler implements KeyDownHandler { @Override public void onKeyDown(KeyDownEvent event) { if(event.getNativeKeyCode() == KeyCodes.KEY_ENTER){ Window.alert(((TextBox)event.getSource()).getValue()); } } } }
完成所有更改後,讓我們以開發模式編譯並運行應用程式,就像我們在「gwt-創建應用程式」一章中所做的那樣。如果你的申請一切順利,這將產生以下結果;