2013-09-22 55 views
2

嘗試過有人建議的KeyEvents我切換到按鍵綁定激活箭頭鍵的推動某些事件而一個是在一個TextArea按鍵綁定作爲替代KeyEvent的還是非功能性

     area.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
        .put(KeyStroke.getKeyStroke("VK_UP"), 
          "doEnterAction"); 
        area.getActionMap().put("doEnterAction", new AbstractAction(){ 
         @Override 
         public void actionPerformed(ActionEvent e){ 
          System.out.println("Event Handled"); 
          oneRay[pick][0] = (""); 
          if(i>=4){ 
           i=0; 
           area.setText(""); 
          } 
          caller(); 
         } 
        }); 

        area.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
        .put(KeyStroke.getKeyStroke("VK_DOWN"), 
          "doEnterAction"); 
        area.getActionMap().put("doEnterAction", new AbstractAction(){ 
         @Override 
         public void actionPerformed(ActionEvent e){ 
          System.out.println("Event 2 Handled"); 
          area.append("\n"+oneRay[pick][1]); 
          buton1.setEnabled(true); 
          buton2.setEnabled(true); 
         } 
        }); 

        area.getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) 
        .put(KeyStroke.getKeyStroke("VK_RIGHT"), 
          "doEnterAction"); 
        area.getActionMap().put("doEnterAction", new AbstractAction(){ 
         @Override 
         public void actionPerformed(ActionEvent e){ 
          if(i>=4){ 
           i=0; 
           area.setText(""); 
          } 
          caller(); 
         } 

此代碼覆蓋三個不同的鍵綁定,但沒有任何工作,無論我按下向左下方的光標,只是在TextArea中朝這個方向移動。 這次我做錯了什麼。請幫幫我!

回答

3

我是否按下左下方的光標,只是在TextArea中朝那個方向移動。

您錯誤地建設的擊鍵。您不應該在按鍵中包含「VK_」。所以基本上沒有任何東西被添加到InputMap中。

而且你的代碼更新的InputMap和ActionMap中一個新的標識符。我發現在ActionMap中替換Action更容易。見Key Bindings所有默認的操作列表以及爲replacing默認操作的基本代碼(這比你上張貼了不同的鏈接)。

最後,在其他發佈你的建議,你要調用一個按鈕的作用。那麼你的代碼應該創建一個可以被按鈕和鍵綁定使用的Action。除了擴展AbstractAction而不是實現ActionListener之外,您創建Action的方式與創建ActionListener的方式相同。

+0

謝謝!我從來沒有考慮過有必要取代現有的功能,我期待一些魔術 - 再次感謝。 (我可能有另外一個問題,雖然很快...) –

+0

@WilliamBrun,對不起我原來的意見是錯的,你的基本代碼是正確的,問題是,你沒有內置擊鍵正確,所以原來的行動仍然還在調用。然而,當你真的只需要用新的Action更新ActionMap時,你的原始代碼也試圖更新InputMap和ActionMap。當我建議您需要更換操作時,這就是我的意思。除非要爲InputMap中不存在的KeyStroke添加和操作,否則不需要對InputMap進行任何更改。 – camickr

+0

嘿!那很棒。我跟蹤了你發送給我的源代碼並跳過了一些內容,現在程序正常運行,而且我對現在可以跳過的內容的假設現在已經得到您的驗證。謝謝。 –