posts - 20, comments - 16, trackbacks - 0, articles - 0

          SWT/JFace 事件的四種寫法(轉)

          Posted on 2008-01-04 16:15 Raul Gong 閱讀(767) 評論(0)  編輯  收藏 所屬分類: eclipse
          轉自: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()中,寫下了這個類的代碼,這就是所謂的匿名內部類。

          缺點:

          1. 由于事件處理,代碼會隨著組件一起分散到代碼中的各個部分,不集中,導致閱讀和維護的不便。
          2. 各事件的處理全部由嵌套的程序塊組成,視覺上很亂,如果事件處理代碼很長,也會導致閱讀和維護不便。
          3. 當菜單欄,工具欄等也需要處理相同的用戶行為時,無法重用事件中的處理代碼,導致代碼不夠簡潔。
          • 命名內部類寫法

               事件代碼使用命名內部類的方式,可以解決匿名內部類的存在的問題, 首先,事件處理代碼都集中在一起,并具有有意義的名字,程序容易閱讀和維護;另外單個事件的處理程序也可以被工具欄,菜單欄等重用。代碼如下:

          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(
          500375);
                  shell.setText(
          "SWT Application");
                  shell.open();

                  Text HelloWorldText 
          = new Text(shell, SWT.BORDER);
                  HelloWorldText.addMouseListener(
          new HelloWorld());
                  HelloWorldText.setText(
          "HelloWorld");
                  HelloWorldText.setBounds(
          526834929);
                  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方法: 失去焦點時觸發。

          主站蜘蛛池模板: 佛冈县| 读书| 嘉义市| 嘉善县| 海城市| 尉犁县| 沾化县| 车致| 中山市| 多伦县| 临沭县| 南华县| 锡林郭勒盟| 北海市| 来凤县| 永平县| 文山县| 黑水县| 襄樊市| 江门市| 政和县| 梁山县| 临湘市| 公安县| 淅川县| 无锡市| 乌海市| 拉萨市| 福建省| 惠水县| 万安县| 芒康县| 龙岩市| 澄迈县| 五常市| 平和县| 河源市| 新河县| 永修县| 新丰县| 竹山县|