Java在JTextField中移动光标

Java在JTextField中移动光标,java,swing,cursor,jtextfield,Java,Swing,Cursor,Jtextfield,我看到过关于使用Robot类按x和y坐标移动光标的问题,但我正试图找出如何在JTextField中的文本中重新定位光标 try { jTextField1.requestFocus(); jTextField1.setCaretPosition(jTextField1.getText().length()); } catch (IllegalArgumentException ex) { ///Do Something Here... } 我有一个开括号按钮,单击该按钮

我看到过关于使用Robot类按x和y坐标移动光标的问题,但我正试图找出如何在JTextField中的文本中重新定位光标

try {
    jTextField1.requestFocus();
    jTextField1.setCaretPosition(jTextField1.getText().length());
}
catch (IllegalArgumentException ex) {
    ///Do Something Here...
}
我有一个开括号按钮,单击该按钮时,将获取JTextField中已经存在的任何文本,concat”()并将其设置为JTextField

try {
    jTextField1.requestFocus();
    jTextField1.setCaretPosition(jTextField1.getText().length());
}
catch (IllegalArgumentException ex) {
    ///Do Something Here...
}

我想知道如何添加右括号,但将光标放在2之间,这样用户就可以不间断地键入。有什么建议吗?

如果您想将JTextField中的插入符号从按钮移动到特定位置,那么一种方法是首先使用JTextField.reques设置焦点tFocus()方法然后需要使用JTextField.setCaretPosition()方法来实际重新定位插入符号

如果您有一个名为jTextField1的JTextField,并且希望将插入符号移动到其中包含的文本末尾,则可以使用:

jTextField1.requestFocus(); //
jTextField1.setCaretPosition(jTextField1.getText().length());
您需要注意不要超过JTrimeWord中的文本长度,否则将出现一个“强”>“ILLALGALGUMUMENT异常”/“强”>,您可以通过在TI/catch块中围绕上面的代码来捕获。您还需要考虑在JTrordField.T/P>中可能没有任何文本的那些时间。
try {
    jTextField1.requestFocus();
    jTextField1.setCaretPosition(jTextField1.getText().length());
}
catch (IllegalArgumentException ex) {
    ///Do Something Here...
}
要将括号附加到JTextField的末尾,然后将插入符号放在括号之间,如下所示:

String txt = jTextField1.getText(); // Get the text contained in Textfield (if any)
if (txt.equals("")) { txt+= "()"; } // Nothing for text so just add Parenthases 
else { txt+= " ()"; } // Some text there so add a space and Parenthases
jTextField1.setText(txt);
try {
    // Set focus to JTextField
    jTextField1.requestFocus();
    // Move the caret between the Parenthases
    jTextField1.setCaretPosition(jTextField1.getText().length()-1);
}
catch (IllegalArgumentException ex) {
    // Do something here...
}
我有一个开括号按钮,单击该按钮时,将获取JTextField中已经存在的任何文本,concat”()并将其设置为JTextField

try {
    jTextField1.requestFocus();
    jTextField1.setCaretPosition(jTextField1.getText().length());
}
catch (IllegalArgumentException ex) {
    ///Do Something Here...
}
不要使用getText()/setText()来执行此操作

相反,您只想将新文本“附加”到文本字段中

因此,ActonListener中的逻辑可能类似于:

int end = textField.getDocument.getLength();
textField.setCaretPosition(end);
textfield.replaceSelection("()");
textField.setCaretPosition(end + 1);
追加文本更有效,因为您只为添加的文本生成
DocumentEvent

如果使用getText()/setText()方法,则为删除文本生成一个
DocumentEvent
,然后为添加的文本生成第二个事件,该事件不反映实际发生的情况


此外,使用文档长度而不是获取文本也更有效,因为您不需要实际创建字符串对象。

文本字段中的光标称为插入符号,您可以直接通过文本字段修改其位置。根据您的问题,我建议使用DocumentFilterOh get and set插入符号brilliant!谢谢。那么,如果我现在能够获得插入符号的索引,是否仍然需要保存并合并到新字符串,或者您可以插入“()”直接在该索引上,然后将插入符号设置为插入符号+1的原始索引?实际上,我认为
DocumentFilter
更适合您的需要,或者
JFormattedTextField
非常好,我认为如果插入符号最初不在末尾,我可能应该添加int position=jTextField1.getCaretPosition();首先,然后我需要添加括号,然后我想我会做jTextField1.setCaretPosition(位置+1);至于在插入符号的每一侧获得两段字符串,我想唯一的方法是生成两个子字符串,一个来自(0,位置),另一个来自(位置)以获取后面的所有内容,然后再执行jTextField1.setText(子字符串1.concat(“()”)。concat(子字符串2);正确吗?