Live a simple life

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

          【原創(chuàng)】關(guān)于JFace的一個(gè)bug(可編輯單元格雙擊,會(huì)頻繁調(diào)用TableViewer的雙擊處理)

                  閑話稍說(shuō),直接上bug視頻:
                  Bug視頻
                 大致現(xiàn)象:在一個(gè)可編輯tableviewer的單元格中,雙擊,對(duì)應(yīng)的編輯對(duì)話框會(huì)不時(shí)彈出多次。我這邊嚴(yán)重的時(shí)候,會(huì)連續(xù)彈出將近20次,那就只能修改了~_~

                Bug分析:
                調(diào)試了一把,發(fā)現(xiàn)是SWT底層將同一鼠標(biāo)事件(通過(guò)event.time可以確認(rèn))連續(xù)發(fā)送了多次。而JFace中的TableEditorImpl將這事件轉(zhuǎn)發(fā)給了tableviewer,tableviewer會(huì)進(jìn)一步調(diào)用對(duì)應(yīng)的double click listener。開(kāi)發(fā)人員做的double click listener實(shí)現(xiàn)就是彈出一個(gè)編輯對(duì)話框。問(wèn)題就出現(xiàn)了,當(dāng)彈出的對(duì)話框關(guān)閉之后,馬上有彈出了,上面說(shuō)過(guò),重復(fù)事件又被廣播了~_~

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

              【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中定義了一個(gè)雙擊事件的時(shí)間戳,緩存上次處理的雙擊事件的時(shí)間戳
                   2、在轉(zhuǎn)發(fā)雙擊事件之前,做時(shí)間戳檢查,避免同一雙擊事件被處理了多次

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

                          //add by zhuxing:上次處理的雙擊事件的時(shí)間戳
                          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();
                                          
                                          //檢查本次要處理的雙擊事件是否和上次的事件重復(fù)
                                          if (e.time != lastDoubleclickEventTime) {
                                               lastDoubleclickEventTime = e.time;
                                               handleDoubleClickEvent();
                                          }

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

                  

                   希望能幫到遇到類似問(wèn)題的同學(xué)

          本博客中的所有文章、隨筆除了標(biāo)題中含有引用或者轉(zhuǎn)載字樣的,其他均為原創(chuàng)。轉(zhuǎn)載請(qǐng)注明出處,謝謝!

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

          評(píng)論

          # re: 【原創(chuàng)】關(guān)于JFace的一個(gè)bug(可編輯單元格雙擊,會(huì)頻繁調(diào)用TableViewer的雙擊處理)  回復(fù)  更多評(píng)論   

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

          只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


          網(wǎng)站導(dǎo)航:
           
          主站蜘蛛池模板: 许昌县| 马龙县| 石泉县| 黄大仙区| 巴彦淖尔市| 华池县| 清原| 合肥市| 石泉县| 宿松县| 东兰县| 米易县| 镇原县| 红桥区| 阿城市| 麟游县| 新巴尔虎右旗| 新竹市| 广南县| 团风县| 邵阳县| 汕头市| 高淳县| 永嘉县| 台中市| 青川县| 河北区| 内江市| 焉耆| 昭通市| 岳阳县| 阿拉善右旗| 河北区| 临海市| 当雄县| 疏勒县| 栖霞市| 湘潭市| 开江县| 福贡县| 个旧市|