在JTextArea中设置插入位置

nic*_*cks 5 java swing listener jtextarea textselection

我有一个JTextArea.我有一个函数,在调用某个组合时选择一些文本.它做得很好.问题是,我想在选择一些文本并按下VK_LEFT时将插入符号移动到选择位置.KeyListener正确实现,我以其他方式测试它.问题是,当我编写以下代码时:

@Override public void keyPressed( KeyEvent e) {
        if(e.getKeyChar()==KeyEvent.VK_LEFT)
            if(mainarea.getSelectedText()!=null)
                mainarea.setCaretPosition(mainarea.getSelectionStart());
    }
Run Code Online (Sandbox Code Playgroud)

并将此侦听器的实例添加到mainarea,选择一些文本(使用我的函数)并按向左箭头键,插入符号位置设置为选择的结尾...而我不会在开头...什么是这件事?:S

kle*_*tra 7

这是一段代码片段

    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);
Run Code Online (Sandbox Code Playgroud)

注意:不建议重新定义通常安装的键绑定,如任何箭头键,用户可能会非常烦恼;-)更好地寻找一些尚未绑定的键.

  • +1,用于键绑定.希望有一天人们会忘记KeyListeners.虽然我会将TextAction扩展为与编辑器套件中定义的Actions一致.然后,您可以使用getFocusedComponent()来获取要处理的文本组件. (2认同)