2014-10-10 46 views
0

我編寫了一個Swing GUI,它在JMenuItems上使用KeyAccelerators。長按觸發加速器的按鍵會導致EventQueue堆棧命令並阻止GUI。我希望AWT Event Queue不要在其中包含多個(或兩個)帶有Control Modifier的KeyEvent。我試過這個:防止AWT事件隊列超載

  AWTEvent awtevent = Toolkit.getDefaultToolkit() 
         .getSystemEventQueue().peekEvent(); 
       if (awtevent != null) { 
        String paramString = awtevent.paramString(); 
        if ((paramString.indexOf("modifiers=Ctrl") != -1 && ((KeyEvent) event) 
          .isControlDown())) { 
         ((KeyEvent) event).consume(); 
        } else if (paramString.indexOf("modifiers=Ctrl") != -1 
          && (paramString.indexOf("keyChar=Undefined") != -1)) { 
         ((KeyEvent) event).consume(); 

        } 
       } 

但它非常不可靠,因爲它有時會消耗一個不應該被消耗的事件。

回答

2

你不能從外面可靠地做到這一點。從事件派發線程外部操作事件隊列不是線程安全的,並且您無法在事件派發線程上執行任務,該事件派發線程會在處理該任務本身之前發佈事件。你也許可以每隔一兩秒將一個清理任務推送到隊列中,以處理尚未處理的事件,但是......不。

如果你想過濾AWT/Swing事件,那麼你需要安裝自己的事件隊列,這比聽起來容易。您可能會發現this article具有啓發性。

+0

另請參閱此[問與答](http://stackoverflow.com/q/3158254/230513)。 – trashgod 2014-10-10 22:10:56