Java 在JTextArea中设置插入符号位置
我有一个工作区。我有一个函数,在调用某个组合时选择一定数量的文本。做得很好。问题是,我想将插入符号移动到选中某些文本并按下VK_LEFT时开始的选择。KeyListener实现正确,我用另一种方法测试了它。问题是,当我编写以下代码时: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
@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的所有内容都被包装以适合输入/动作映射