我使用的是GEF0.10(http://gef.tigris.org),在某一個Fig上點擊鼠標右鍵彈出PopupMenu時,發現有閃爍的現象,經過追查發現,一個鼠標右擊動作會分別觸發Editor.mousePressed(e)、mouseReleased(e)、mouseClicked(e)三個事件,這些事件最終都要流經ModeManager,而ModeManager采取的是廣播的方式分發這些事件,把這些事件依次轉發給mode對列中的所有Mode。ModePopup是默認的一個Mode之一,負責提供Fig的彈出菜單功能。而ModePopup中的這三個事件都作了如下的判斷:
public void mouseClicked(MouseEvent me) {
boolean popUpDisplayed = false;
if(me.isPopupTrigger() || me.getModifiers() == InputEvent.BUTTON3_MASK) {
popUpDisplayed = showPopup(me);
if (LOG.isDebugEnabled()) {
if (popUpDisplayed) LOG.debug("MousePressed detected as a popup and popup displayed and event consumed");
else LOG.debug("MousePressed detected as a popup but no popup to display");
}
return;
}
LOG.debug("MousePressed is not a popup trigger");
}
其中加紅的這段不知道為什么要作me.getModifiers() == InputEvent.BUTTON3_MASK的判斷,加上這個判斷后只要是鼠標右擊動作,ModePopup的mousePressed、mouseReleased和mouseClicked事件中showPopup的代碼都要被執行,這樣在一個鼠標右擊動作中實際上彈出了三次PopupMenu,因此造成了閃爍。解決辦法是extend默認的ModePopup,覆蓋這三個方法,將判斷改成if ( me.isPopupTrigger())即可。