如何在 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);
  }
}