你为什么混合KeyBinding
和KeyListener
?
不要使用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);
}
});
}
你修复它,问题是我没有把方法放在事件中:/,谢谢你的回答 – user1977204