如何在 JTextField 中移动光标位置
How to move the cursor position in a JTextField
我有一个 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()
可能是我要找的东西,但它没有用。
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
声明为 final 才能生效。
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);
}
重置插入符号位置的是 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);
}
}
我有一个 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()
可能是我要找的东西,但它没有用。
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
声明为 final 才能生效。
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);
}
重置插入符号位置的是 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);
}
}