有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在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) 个答案

  1. # 1 楼答案

    重置插入符号位置的是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);
      }
    }
    
  2. # 2 楼答案

    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);
    }  
    
  3. # 3 楼答案

    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声明为最终版本,这样才能工作