在我的程序中, SHIFT + ENTER 键在文本区域中执行换行,但是当y删除 ENTER 键程序崩溃,我可以吗?,添加 SHIFT + ENTER 键的功能,并删除Enter键的标准行为。 我的以下代码是,对于Enter键的删除行为:
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方法中的方法
答案 0 :(得分:2)
为什么要混用KeyBinding
和KeyListener
?
不要在Swing中使用KeyListener
/ KeyAdapter
。始终使用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
,因此为密钥的发布添加了{em> Keybinding
,但是当按下密钥时可以使用false
并且会发生相同的结果。另一个参数是 SHIFT 关闭时。
同样要删除 ENTER ,你应该按键按下:
KeyStroke enter = KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0, false);
InputMap inputMap = jta.getInputMap();
inputMap.put(enter, "none");
注意我使用false
,这意味着当按下键时会放置键绑定。
以下是一个例子:
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);
}
});
}
答案 1 :(得分:1)
我认为您的问题类似于keyEventIssue with keyPressed
您应该使用keyReleased
而不是keyPressed
来避免输入行为。
请在上面的链接中查看我的回答,如果没有帮助或问题不同,请告诉我
答案 2 :(得分:0)
这是我用来删除在enter和shift-enter上工作的deafult JTable行导航的代码
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)替换null。在我的例子中,我在自定义JTable的构造函数中使用了自定义接口参数中的方法。