2014-01-23 21 views
0

我有一種方法,他根據點擊按鈕執行另一種方法。 只有他似乎在運行被稱爲兩次的方法,我不知道爲什麼。任何人都可以幫助我,向我解釋爲什麼這是?遵循源因爲這種方法正在運行兩次

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
     @Override 
     public void eventDispatched(final AWTEvent event) { 
      final KeyEvent evt = (KeyEvent) event; 
      switch (evt.getKeyCode()) { 
       case KeyEvent.VK_F1: { 
        //F1 
        doSomething(); // this method is running twice 

        break; 
       } 
       case KeyEvent.VK_F2: { 
        //F2 
        doSomething(); 
        break; 
       } 
       }, AWTEvent.KEY_EVENT_MASK); 

感謝

+0

看在這篇文章的答案:http://stackoverflow.com/questions/9864297/onkey-event-dispatched-twice-when-i-type-some-text-into-a-textbox-how-to-preven – mdewitt

+0

@ mdewitt這沒有幫助。他正在檢查是否按下了正確的按鍵。 –

+0

@Stendika但是他可能會從倒閉動作中獲得一個事件,並從正確的按鍵中獲得一個動作。兩者都有正確的密鑰代碼。 – mdewitt

回答

0

您正在接收KEY_PRESSED和KEY_RELEASED事件。

除了KeyEvent有正確的KeyCode之外,您還需要檢查是否要確保它是正確的操作,即KEY_PRESSSED。解決這個問題的一個方法是在進入switch語句之前添加一個檢查操作。

Toolkit.getDefaultToolkit().addAWTEventListener(new AWTEventListener() { 
    @Override 
    public void eventDispatched(final AWTEvent event) { 
     if (event.getKeyChar() == KeyEvent.KEY_PRESSED) 
     { 
      final KeyEvent evt = (KeyEvent) event; 
      switch(event.getKeyCode()){ 
       //switch statement code 
      } 
     } 
    }, AWTEvent.KEY_EVENT_MASK); 

你可以做的另一件事是建立一個KeyEventDispatcher,並把它添加到KeyboardFocusManager這樣的:

//create KeyEventDispatcher myKeyEventDispatcher 
    KeyboardFocusManager focusManager = KeyboardFocusManager. 
      getCurrentKeyboardFocusManager(); 
    focusManager.addKeyEventDispatcher(myKeyEventDispatcher); 

這樣,你將只能得到關鍵事件,你可以自己派遣他們

+0

我明白了。謝謝。 – Rafael

+0

不客氣。如果其中一個答案對你有幫助,你可以接受它,所以這不再是一個沒有答案的問題。 – mdewitt

2

的問題似乎是,無論是按鍵和鍵釋放方法觸發事件。我建議使用java.awt.event.KeyListener,它具有用於新聞和發佈事件的單獨事件處理程序。