如何在JTextField中移动光标位置

时间:2015-07-09 16:08:27

标签: java cursor 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()可能正是我想要的,但它没有用。

3 个答案:

答案 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);
  }
}