轉自:
http://blog.csdn.net/yjyvsdream/archive/2007/04/05/1552978.aspx
好像樓主也是轉自《Eclipse 從入門到精通》,非常感謝ChenGang。
SWT/JFace 事件的四種寫法
SWT 的事件模型和 JAVA 標準的 AWT 基本一樣的。下面將按照,事件的四種寫法來實現它。下面的代碼都是和上一個學習筆記里的小例子變化來的。
在原來代碼行"HelloWorldText = new Text(shell, SWT.BORDER);"下面插入如下的代碼:
HelloWorldText.addMouseListener(new MouseAdapter()...{
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello world");
}
});
new MouseAdapter(); 就是一個匿名內部類。 我們建立了一個繼承于MouseAdapter的類,但并沒有給這個類命名,并且沒有用通常的寫法,而是直接在HelloWorldText.addMouseListener()中,寫下了這個類的代碼,這就是所謂的匿名內部類。
缺點:
- 由于事件處理,代碼會隨著組件一起分散到代碼中的各個部分,不集中,導致閱讀和維護的不便。
- 各事件的處理全部由嵌套的程序塊組成,視覺上很亂,如果事件處理代碼很長,也會導致閱讀和維護不便。
- 當菜單欄,工具欄等也需要處理相同的用戶行為時,無法重用事件中的處理代碼,導致代碼不夠簡潔。
事件代碼使用命名內部類的方式,可以解決匿名內部類的存在的問題, 首先,事件處理代碼都集中在一起,并具有有意義的名字,程序容易閱讀和維護;另外單個事件的處理程序也可以被工具欄,菜單欄等重用。代碼如下:
public class HelloWorld ...{
private static Text HelloWorldText;
public static void main(String[] args) ...{
... ...
HelloWorldText = new Text(shell, SWT.BORDER);
HelloWorldText.addMouseListener(new MyMouseDoubleClick());//引用定義的類
... ...
}
// 定義一個匿名內部類
private static final class MyMouseDoubleClick extends MouseAdapter...{
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello ... ai wo , ni shi wo de !!!");
}
}
}
這種寫法和命名內部類有些相似,只不過是將MyMouseDoubleClick類從HelloWorld.java 中拿出去,單獨寫成一個類文件。代碼和命名內部類的相同,我就不重復了。
將HelloWorld 類實現 MouseListener 接口,這樣類本身就成了一個監聽器,使得加入監聽器的代碼可以更加的簡潔,這種方式適合加入監聽器的組件較多,并且要求監聽器的事件處理代碼可以被組件共用。
實現MouseListener接口要寫的事件方法多一些,沒有用到的可以為空實現。如果繼承MouseListener 接口的適配器MouseAdapter, 則只寫需要的方法就可以了。另外需要注意的是,只有接口才有多繼承的特性,所以,如果HelloWorld已經是某個類的子類了,就只能用實現接口的方式,而不能繼承接口的適配器了。代碼如下:
public class HelloWorld implements MouseListener...{ // or extends MouseAdapter
public static void main(String[] args) ...{
final Display display = Display.getDefault();
final Shell shell = new Shell();
shell.setSize(500, 375);
shell.setText("SWT Application");
shell.open();
Text HelloWorldText = new Text(shell, SWT.BORDER);
HelloWorldText.addMouseListener(new HelloWorld());
HelloWorldText.setText("HelloWorld");
HelloWorldText.setBounds(52, 68, 349, 29);
shell.layout();
while (!shell.isDisposed()) ...{
if (!display.readAndDispatch())
display.sleep();
}
}
public void mouseDoubleClick(MouseEvent e) ...{
MessageDialog.openInformation(null,"","Hello ... ai wo de re !!");
}
//if extends MouseAdapter , delete the follow methods
public void mouseDown(MouseEvent e) ...{
}
public void mouseUp(MouseEvent e) ...{
}
}
SWT/JFace 中常用的事件
除了,上面用到的addMouseListener, Eclipse 還有一些常用的監聽器,它們在各組件里的使用方法相同(如果該組件支持此種事件),簡單介紹如下:
addSelectionListener: 這個監聽器最常用。
widgetSelected 方法:當組件被選擇(單擊鼠標或按回車鍵)時觸發此方法的事件處理程序。
widgetDefaultSelected 方法: 用于某些很少觸發選擇事件的組件,例如:文本框回車事件,列表框雙擊事件等。
addKeyListener:
keyPressed 方法:當前焦點停留在組件時,按下鍵盤任意鍵時觸發,但對于某些組件(如:button),按回車鍵無法執行此方法。
keyReleased方法: 按鍵彈起時觸發。
addFocusListener
focusGained方法: 得到焦點時觸發。
focusLost方法: 失去焦點時觸發。