java - SHIFT + ENTER 和 Java 中同一组件中的 ENTER

标签 java swing key behavior key-bindings

在我的程序中,hte 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+Enter 键的新行,我的代码是:

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

此外,ENTER 键必须调用 keyPressed 方法中的方法

最佳答案

为什么要混合使用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 以便在释放 key 时添加 Keybinding,尽管您可以在释放 key 时使用 false按下 键,会出现相同的结果。另一个参数是 SHIFT 按下时的参数。

要删除ENTER,您应该在按下的键上执行此操作:

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

请注意,我使用false,这意味着按下按键时会放置键绑定(bind)。

这是一个例子:

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);
            }
        });
    }

关于java - SHIFT + ENTER 和 Java 中同一组件中的 ENTER,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14318191/

相关文章:

java - 如何格式化 SQL DATETIME 以将其与给定日期进行比较并检索一条记录?

java - 如何在 Intellij 中使用 LWJGL 2 而不是 LWJGL 3?

java - BoxLayout 程序不工作

python - 自动从字典中调用键

php - 如何替换多维数组中的键并保持顺序

java - 如何将 EditText 中的多个值设置为 1 Textview 并自动显示而无需单击按钮

java - 如何使用 @ConfigurationProperties 和 @Autowired 测试类

mysql - SQL查询从3个有关系的表中检索信息

java - 为什么需要单击两次才能突出显示我的 JTree?

java - 定位特定的 JXTable 列值以在新框架中打开