Live a simple life

          沉默(zhu_xing@live.cn)
          隨筆 - 48, 文章 - 0, 評論 - 132, 引用 - 0
          數據加載中……

          【原創】關于JFace的一個bug(可編輯單元格雙擊,會頻繁調用TableViewer的雙擊處理)

                  閑話稍說,直接上bug視頻:
                  Bug視頻
                 大致現象:在一個可編輯tableviewer的單元格中,雙擊,對應的編輯對話框會不時彈出多次。我這邊嚴重的時候,會連續彈出將近20次,那就只能修改了~_~

                Bug分析:
                調試了一把,發現是SWT底層將同一鼠標事件(通過event.time可以確認)連續發送了多次。而JFace中的TableEditorImpl將這事件轉發給了tableviewer,tableviewer會進一步調用對應的double click listener。開發人員做的double click listener實現就是彈出一個編輯對話框。問題就出現了,當彈出的對話框關閉之后,馬上有彈出了,上面說過,重復事件又被廣播了~_~

              
               修改方法:
               時間較緊,就直接在TableEditorImpl這邊修改了一把。將org.eclipse.jface插件以源碼工程方式導入,將TableEditorImpl.java類做了一定的修改,加了一個雙擊事件的時間戳判斷。

              【TableEditorImpl.java原有代碼,Eclipse 3.2版本】
                mouseListener = new MouseAdapter() {
                                  public void mouseDown(MouseEvent e) {
                                      // time wrap? 
                                      // check for expiration of doubleClickTime
                                      if (e.time <= doubleClickExpirationTime) {
                                          control.removeMouseListener(mouseListener);
                                          cancelEditing();
                                           handleDoubleClickEvent();
                                      } else if (mouseListener != null) {
                                          control.removeMouseListener(mouseListener);
                                      }
                                  }
                              };

                  【修改后代碼】
                   1、首先在TableEditorImpl中定義了一個雙擊事件的時間戳,緩存上次處理的雙擊事件的時間戳
                   2、在轉發雙擊事件之前,做時間戳檢查,避免同一雙擊事件被處理了多次

                       abstract class TableEditorImpl {
                          ...其他代碼省略

                          //add by zhuxing:上次處理的雙擊事件的時間戳
                          private int lastDoubleclickEventTime;

                          private void activateCellEditor() {
                                  ..................................
                                  mouseListener = new MouseAdapter() {
                                  public void mouseDown(MouseEvent e) {
                                      // time wrap? 
                                      // check for expiration of doubleClickTime
                                      if (e.time <= doubleClickExpirationTime) {
                                          control.removeMouseListener(mouseListener);
                                          cancelEditing();
                                          
                                          //檢查本次要處理的雙擊事件是否和上次的事件重復
                                          if (e.time != lastDoubleclickEventTime) {
                                               lastDoubleclickEventTime = e.time;
                                               handleDoubleClickEvent();
                                          }

                                      } else if (mouseListener != null) {
                                          control.removeMouseListener(mouseListener);
                                      }
                                  }
                              };
                          }
                      }

                  

                   希望能幫到遇到類似問題的同學

          本博客中的所有文章、隨筆除了標題中含有引用或者轉載字樣的,其他均為原創。轉載請注明出處,謝謝!

          posted on 2008-08-01 11:20 zhuxing 閱讀(1705) 評論(1)  編輯  收藏

          評論

          # re: 【原創】關于JFace的一個bug(可編輯單元格雙擊,會頻繁調用TableViewer的雙擊處理)  回復  更多評論   

          應該在bugs.eclipse.org反映一下啊
          2008-08-01 11:29 | Always BaNg.

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 桐城市| 桂平市| 淮南市| 兴文县| 邹平县| 凤翔县| 郓城县| 宾川县| 云梦县| 台江县| 噶尔县| 凤山市| 虎林市| 开阳县| 炎陵县| 贵州省| 张北县| 南陵县| 星子县| 昌黎县| 晴隆县| 洛阳市| 丰镇市| 永靖县| 湘阴县| 大港区| 蕉岭县| 左云县| 西平县| 德清县| 台中县| 富阳市| 十堰市| 中卫市| 松滋市| 深水埗区| 陈巴尔虎旗| 沾益县| 天气| 湟中县| 托克逊县|