2

在我的程序中 hte SHIFT+ENTER键在文本区域中换行,但是当您删除键的既定行为时ENTER程序崩溃,我可以这样做吗?添加SHIFT+ENTER键的功能并删除 Enter 键的标准行为。我的以下代码是,对于 Enter 键的删除行为:

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

对于带有SHIFT+Enter键的新行,我的代码是:

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

键也ENTER必须调用 keyPressed 方法中的方法

4

3 回答 3

3

你为什么混合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)

注意最后两个参数。true用于在释放Keybinding键时添加,但您可以在按下键时使用,并且会出现相同的结果。另一个参数用于何时关闭。falseSHIFT

另外要删除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);
            }
        });
    }
于 2013-01-14T18:33:12.297 回答
1

我认为您的问题类似于带有 keyPressed 的 keyEventIssue

您应该使用keyReleased而不是keyPressed避免输入行为。

请检查我在上面链接中的答案,如果它没有帮助或者您的问题是否不同,请告诉我

于 2013-01-14T12:18:04.217 回答
0

这是我用来删除在 enter 和 shift-enter 上工作的默认 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)替换。在我的例子中,我在自定义 JTable 的构造函数上使用了自定义接口参数中的方法。

于 2016-07-01T05:38:03.540 回答