我已经看到有关使用Robot类通过x和y坐标移动游标的问题,但我试图弄清楚如何在JTextField中的文本之间重新定位游标。
我有一个打开的括号按钮,单击它时将获取JTextField中可能存在的任何文本,concat"("到它并将其设置为JTextField。
我想知道如何添加右括号,但是将光标放在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对象。