<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    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 閱讀(1695) 評論(1)  編輯  收藏

    評論

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

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

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


    網站導航:
     
    主站蜘蛛池模板: 亚洲va久久久噜噜噜久久男同 | 亚洲香蕉久久一区二区三区四区| 永久免费观看黄网站| 爽爽日本在线视频免费| 亚洲色大情网站www| 午夜毛片不卡免费观看视频| 亚洲高清中文字幕免费| 成年人视频在线观看免费| 四虎必出精品亚洲高清| 女人18毛片免费观看| 亚洲精品色播一区二区 | 中文字幕中韩乱码亚洲大片| 一个人晚上在线观看的免费视频| 亚洲国产午夜中文字幕精品黄网站| 无遮挡a级毛片免费看| 国产亚洲欧洲Aⅴ综合一区| a级毛片免费播放| 久久亚洲一区二区| 无人在线直播免费观看| 亚洲日韩国产欧美一区二区三区 | 在线播放高清国语自产拍免费| 亚洲色在线无码国产精品不卡| 国产免费观看黄AV片| 亚洲一区二区三区免费| 免费无码专区毛片高潮喷水| 又大又粗又爽a级毛片免费看| 未满十八私人高清免费影院| 亚洲人成人一区二区三区| 99久久99久久精品免费观看| 天天爽亚洲中文字幕| 亚洲偷自拍拍综合网| 少妇无码一区二区三区免费| 中文字幕在线日亚洲9| 亚洲国产精品无码久久青草| 亚洲精品无码少妇30P| 久久激情亚洲精品无码?V| 亚洲免费视频观看| 色多多免费视频观看区一区| 日本大片在线看黄a∨免费| 久久久久免费视频| 精品亚洲AV无码一区二区|