2013-01-14 29 views
2

在同一組件進入了我的程序興田SHIFT + ENTER鍵確實在文本區域一個新的生產線,但是當y刪除的既定行爲ENTER鍵程序崩潰,我可以這樣做嗎?,添加功能爲SHIFT + ENTER鍵並刪除Enter鍵的標準行爲。 我下面的代碼是,對於輸入的刪除行爲的關鍵:Shift + Enter,與Java中

public void removeEnterBehavior(){ 
    KeyStroke enter = KeyStroke.getKeyStroke("ENTER"); 
    InputMap inputMap = messageTextArea.getInputMap(); 
    inputMap.put(enter, "none"); 
} 

爲了與SHIFT + 輸入鍵的新生產線,我的代碼是:

@Override 
    public void keyPressed(KeyEvent e) { 
     if(e.getKeyCode() == KeyEvent.VK_ENTER && (e.getModifiers() & InputEvent.SHIFT_MASK) != 0){ 
      addNewLine(); 
     } 
    } 

另外,ENTER鍵必須調用keyPressed方法

回答

1

我認爲你的問題類似於keyEventIssue with keyPressed

您應該使用keyReleased而不是keyPressed來避免輸入行爲。

請檢查我的答案在上面的鏈接,讓我知道,如果它不能幫助,或者如果你的問題是不同的

+0

你修復它,問題是我沒有把方法放在事件中:/,謝謝你的回答 – user1977204

2

你爲什麼混合KeyBindingKeyListener

不要使用KeyListener/KeyAdapter與Swing。始終使用KeyBindings

你應該做這樣的事情來監聽SHIFT + ENTER(它可以在鍵釋放或按下按鍵)

jta.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true), "Shift+Enter released"); 
jta.getActionMap().put("Shift+Enter released", new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent ae) { 
     System.out.println("Shift+Enter released"); 
    } 
}); 

最重要的部分是:

KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true) 

注意最後2個參數。 true被使用,所以Keybinding被添加爲在版本的關鍵,雖然你可以使用false當鍵被按下時,會發生相同的結果。另一個參數用於當SHIFT已關閉。

還可除去ENTER你應該這樣做的鍵按下:我用false這意味着鍵綁定

KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false); 
InputMap inputMap = jta.getInputMap(); 
inputMap.put(enter, "none"); 

注意放置的時候關鍵是按下

下面是一個例子:

public static void main(String[] args) { 
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       JFrame frame = new JFrame(); 
       frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
       JTextArea jta = new JTextArea(20, 20); 

       //remove enter pressed 
       KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false); 
       InputMap inputMap = jta.getInputMap(); 
       inputMap.put(enter, "none"); 

       //add shift+enter keybinding can be on pressed or released i.e false or true 
       jta.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, KeyEvent.SHIFT_DOWN_MASK, true), "Shift+Enter released"); 
       jta.getActionMap().put("Shift+Enter released", new AbstractAction() { 
        @Override 
        public void actionPerformed(ActionEvent ae) { 
         System.out.println("Shift+Enter released"); 
        } 
       }); 

       frame.add(jta); 

       frame.pack(); 
       frame.setVisible(true); 
      } 
     }); 
    } 
0

這裏是我用於去除deafult JTable's行導航,關於作品的代碼輸入和移位輸入

ActionMap am = table.getActionMap();   
    table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER,0), "Enter pressed"); 
    table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT).put(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, InputEvent.SHIFT_DOWN_MASK, false), "Shift+Enter pressed"); 
    am.put("Enter pressed",null); 
    am.put("Shift+Enter pressed", null); 

即空可以被任何你需要的自定義動作(例如AbstractAction)所取代。在我的情況下,我使用了我自定義的JTable的構造函數中的一個自定義接口參數的方法。

相關問題