我有一个JTextField inputTextField
,我想在按下∨
时将符号orButton
添加到光标位置的文本字段中。下面的方法有效,但按下按钮后,光标出现在字段的末尾,而不是按下按钮之前的位置。
如何设置光标移回原位?
private void orButtonActionPerformed(java.awt.event.ActionEvent evt)
{
int caretPosition = inputTextField.getCaretPosition();
String currentText = inputTextField.getText();
String newText = currentText.substring(0, caretPosition) +
"∨" + currentText.substring(caretPosition, currentText.length());
inputTextField.setText(newText);
inputTextField.requestFocus();
}
我认为setCaretPosition()
可能正是我想要的,但它没有用。
答案 0 :(得分:2)
setCaretPosition()
应该是正确的方法。但是,当文本字段获得焦点时,似乎将插入符号设置为再次定位0
。您可以尝试将其包含在SwingUtilities.invokeLater()
这样的调用中:
private void orButtonActionPerformed(java.awt.event.ActionEventevt) {
final int caretPosition = inputTextField.getCaretPosition();
String currentText = inputTextField.getText();
String newText = currentText.substring(0, caretPosition) +
"∨" + currentText.substring(caretPosition, currentText.length());
inputTextField.setText(newText);
inputTextField.requestFocus();
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
inputTextField.setCaretPosition(caretPosition);
}
});
}
请注意,您必须声明caretPosition
为最终版本才能生效。
答案 1 :(得分:0)
setCaretPosition按预期工作。您需要在调用requestFocus方法之前或之后调用它。下面提供了工作示例:
private void orButtonActionPerformed(java.awt.event.ActionEvent evt)
{
int caretPosition = inputTextField.getCaretPosition();
String currentText = inputTextField.getText();
String newText = currentText.substring(0, caretPosition) +
"∨" + currentText.substring(caretPosition, currentText.length());
inputTextField.setText(newText);
inputTextField.requestFocus();
inputTextField.setCaretPosition(caretPosition);
}
答案 2 :(得分:0)
什么重置了插入符号的位置是setText()
,而不是获得焦点的字段。如果您将setCaretPosition()
放在setText()
和requestFocus()
之间,那么它应该有效。
这是一个有效的例子:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class Test {
public static void main(String[] args) {
JFrame f = new JFrame();
JTextField tf = new JTextField();
JButton b = new JButton("button");
tf.setText("abcdefghijklmnop");
b.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent ev) {
int caretPosition = tf.getCaretPosition();
String currentText = tf.getText();
String left = currentText.substring(0, caretPosition);
String right = currentText.substring(caretPosition, currentText.length());
String newText = left + "v" + right;
tf.setText(newText);
tf.setCaretPosition(caretPosition+1);
tf.requestFocus();
}
});
JPanel p = (JPanel)f.getContentPane();
p.setLayout(new BorderLayout());
p.add(b, BorderLayout.EAST);
p.add(tf, BorderLayout.CENTER);
f.setSize(640, 400);
f.setVisible(true);
}
}