Java 在JTextArea中设置插入符号位置

Java 在JTextArea中设置插入符号位置,java,swing,listener,jtextarea,textselection,Java,Swing,Listener,Jtextarea,Textselection,我有一个工作区。我有一个函数,在调用某个组合时选择一定数量的文本。做得很好。问题是,我想将插入符号移动到选中某些文本并按下VK_LEFT时开始的选择。KeyListener实现正确,我用另一种方法测试了它。问题是,当我编写以下代码时: @Override public void keyPressed( KeyEvent e) { if(e.getKeyChar()==KeyEvent.VK_LEFT) if(mainarea.getSelectedText

我有一个工作区。我有一个函数,在调用某个组合时选择一定数量的文本。做得很好。问题是,我想将插入符号移动到选中某些文本并按下VK_LEFT时开始的选择。KeyListener实现正确,我用另一种方法测试了它。问题是,当我编写以下代码时:

@Override public void keyPressed( KeyEvent e) {
        if(e.getKeyChar()==KeyEvent.VK_LEFT)
            if(mainarea.getSelectedText()!=null)
                mainarea.setCaretPosition(mainarea.getSelectionStart());
    }
并将此侦听器的实例添加到mainarea,选择一些文本(使用我的函数)并按左箭头键,插入符号位置设置为选择的结尾。。。我不想让它在一开始。。。怎么了这是一段代码片段

    Action moveToSelectionStart = new AbstractAction("moveCaret") {

        @Override
        public void actionPerformed(ActionEvent e) {
            int selectionStart = textComponent.getSelectionStart();
            int selectionEnd = textComponent.getSelectionEnd();
            if (selectionStart != selectionEnd) {
                textComponent.setCaretPosition(selectionEnd);
                textComponent.moveCaretPosition(selectionStart);
            }
        }

        public boolean isEnabled() {
            return textComponent.getSelectedText() != null;
        }
    };
    Object actionMapKey = "caret-to-start";
    textComponent.getInputMap().put(KeyStroke.getKeyStroke("LEFT"), actionMapKey);
    textComponent.getActionMap().put(actionMapKey, moveToSelectionStart);

注意:不建议重新定义通常安装的键绑定,如f.i。任何箭头键,用户都可能会非常恼火;-)最好寻找一些尚未绑定的内容。

不要使用KeyListeners,这是一个不-不-永远;-)相反,使用keybindings..IIRC,您可以在设置选择时将插入符号设置为开头。为此,必须将选择从结束位置设置为开始位置。因此,当用户按下左键时,插入符号将位于选择的开始。这不是您想要实现的吗?+1,用于键绑定。希望有一天人们会忘记键盘听众。尽管我将扩展TextAction以与编辑器工具包中定义的操作保持一致。然后,您可以使用getFocusedComponent()获取要操作的文本组件。我想我需要再次澄清:)一般来说,在Swing组件上使用键绑定时,我会扩展AbstractAction。但是,在向文本组件添加操作时,我会扩展TextAction。@camickr-我就是这样理解您的:-)无论如何,这里的要求有点病态。@camickr和kleopatra-为什么这样做而不是使用文本组件的键映射和“AddActionForkeyStrope”方法?每种方法的优缺点?@harmanjd这是旧的api(不推荐使用?不记得了),仅用于文本组件。较新样式的键绑定适用于所有JSomething,并且更加灵活。注意,在内部,注册到keyMap的所有内容都被包装以适合输入/动作映射