SHIFT + ENTER,&在Java中输入相同的组件

时间:2013-01-14 12:10:53

标签: java swing key behavior key-bindings

在我的程序中, 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方法中的方法

3 个答案:

答案 0 :(得分:2)

为什么要混用KeyBindingKeyListener

不要在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的构造函数中使用了自定义接口参数中的方法。