Java在JTextField中移动光标

时间:2017-03-06 06:48:02

标签: java swing cursor jtextfield

我已经看到有关使用Robot类通过x和y坐标移动游标的问题,但我试图弄清楚如何在JTextField中的文本之间重新定位游标。

我有一个打开的括号按钮,单击它时将获取JTextField中可能存在的任何文本,concat"("到它并将其设置为JTextField。

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

2 个答案:

答案 0 :(得分:1)

如果你想将一个JTextField中的Caret从一个按钮移动到一个特定的位置,那么一种方法是首先使用 JTextField.requestFocus()方法设置焦点。你需要使用 JTextField.setCaretPosition()方法来实际重新定位Caret。

如果您有一个名为 jTextField1 的JTextField,并且您想将Caret移动到其中包含的文本的末尾,那么您可以使用:

jTextField1.requestFocus(); //
jTextField1.setCaretPosition(jTextField1.getText().length());

您需要注意不要超过JTextField中的文本长度,否则会发生 IllegalArgumentException ,您可以通过周围捕获 try / catch块中的上述代码。您还需要考虑JTextField中可能没有任何文本的那些时间。

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

将括号添加到JTextField的末尾然后将Caret放在它们之间就是这样的:

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...
}

答案 1 :(得分:0)

  

我有一个打开的括号按钮,单击该按钮将获取JTextField中可能存在的任何文本,将其“连接”并将其设置为JTextField。

不要使用getText()/ setText()来执行此操作。

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

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

int end = textField.getDocument.getLength();
textField.setCaretPosition(end);
textfield.replaceSelection("()");
textField.setCaretPosition(end + 1);

附加文字效率更高,因为您只为添加的文字生成DocumentEvent

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

此外,使用Document中的长度而不是获取文本也更有效,因为您不需要实际创建String对象。