SWT事件Translated By xiaotaoliang 04.12一旦我們創(chuàng)建了display對(duì)象和一些部件,啟動(dòng)了應(yīng)用程序的消息循環(huán),真正的工作從哪里開始發(fā)生呢?答案是每當(dāng)有一個(gè)事件從事件隊(duì)列中被讀取并分發(fā)給某個(gè)部件的時(shí)候。實(shí)際上大部分的應(yīng)用程序邏輯被實(shí)現(xiàn)為對(duì)用戶事件的響應(yīng)。 基本的模式是:為所創(chuàng)建的部件附加一個(gè)監(jiān)聽器,當(dāng)相應(yīng)的事件發(fā)生時(shí),監(jiān)聽器的代碼就會(huì)被執(zhí)行。一個(gè)簡(jiǎn)單的例子被實(shí)現(xiàn)于org.eclipse.swt.examples.helloworld.HelloWorld3: Display display = new Display (); Shell shell = new Shell (display); Label label = new Label (shell, SWT.CENTER); ... shell.addControlListener (new ControlAdapter () { public void controlResized (ControlEvent e) { label.setBounds (shell.getClientArea ()); } }); 對(duì)于每一種監(jiān)聽器,都對(duì)應(yīng)有一個(gè)接口定義這種監(jiān)聽器(XyzListener),一個(gè)類提供事件信息(XyzEvent),還有一個(gè)應(yīng)用程序接口方法負(fù)責(zé)添加監(jiān)聽器(addXyzListener)。如果一個(gè)監(jiān)聽器接口中定義了不只一個(gè)方法,那么相應(yīng)地會(huì)提供一個(gè)適配器(XyzAdapter),它實(shí)現(xiàn)了監(jiān)聽器接口并提供一些空方法(你可以覆蓋之)。所有的事件類,監(jiān)聽器類以及適配器類都定義在包org.eclipse.swt.events.里面。 以下表格總結(jié)了有效的事件以及對(duì)應(yīng)的支持事件的部件:
無(wú)類型事件以上描述的有類型事件系統(tǒng)實(shí)際上是由低級(jí)別的,無(wú)類型的部件事件機(jī)制實(shí)現(xiàn)的。這種機(jī)制不打算讓應(yīng)用程序使用,不過(guò)你會(huì)看到SWT的實(shí)現(xiàn)中使用了這種機(jī)制,很多工作臺(tái)向?qū)ы?yè)的實(shí)現(xiàn)也使用了這種機(jī)制。 無(wú)類型事件機(jī)制依賴一個(gè)常量去標(biāo)識(shí)事件類型并且為此定義了一個(gè)通用的監(jiān)聽器。這允許監(jiān)聽器實(shí)現(xiàn)“case樣式”的監(jiān)聽模式。在以下的代碼片斷,我們定義一個(gè)通用的事件句柄并把若干監(jiān)聽器附加到Shell窗口。 Shell shell = new Shell (); Listener listener = new Listener () { public void handleEvent (Event e) { switch (e.type) { case SWT.Resize: System.out.println ("Resize received"); break; case SWT.Paint: System.out.println ("Paint received"); break; default: System.out.println ("Unknown event received"); } } }; shell.addListener (SWT.Resize, listener); shell.addListener (SWT.Paint, listener); |
|
來(lái)自: @IT小小鳥@ > 《Sing/SWT/Jface》