Java Swing - 如何将光标定位在 PlainDocument 中的 JTextField 中

Java Swing - How to position cursor inside JTextField from PlainDocument

我的 java swing 应用程序有一个 JTextFied。我正在使用 PlainDocument 子类进行输入操作。

public class MaskDecimalDocument extends PlainDocument {

   public void insertString(int offs, String str, AttributeSet a) throws BadLocationException {

      //manipulation input code

      super.insertString(0, manipulatedText, a);

   }

}

用户插入一个字符,insertString方法处理该字符并将其插入到文本中。下一次操作,光标位于文本的末尾。如何将光标定位在原来的位置?

您可能要考虑使用 DocumentFilter,因为它是较新的 API 来处理对 Document 的更改。概念是相同的,但 class 更可重用,因为它可以添加到任何 Document.

阅读 Implementing a DocumentFilter 上的 Swing 教程部分了解更多信息。

How do I position the cursor at original place ?

当您创建自定义 DocumentFilter class 时,您需要传入使用 Document 作为参数的文本字段并将此文本字段保存为的实例变量你的 class.

那么 replaceSelection(...) 方法中的逻辑类似于:

int caretPosition = textField.getCaretPosition();
super.replaceSelection(...);
textField.setCaretPosition( caretPosition );

请注意,您可能需要将 setCaretPosition(...) 方法放在 SwingUtilities.invokeLater() 中,以确保代码在设置插入符号位置的默认处理后执行。

控制插入符位置不是文档的工作。您应该 set a NavigationFilter 忽略对插入符号位置的所有更改:

textField.setNavigationFilter(new NavigationFilter() {
    @Override
    public void setDot(FilterBypass bypass,
                       int position,
                       Position.Bias bias) {
        // Deliberately empty
    }

    @Override
    public void moveDot(FilterBypass bypass,
                        int position,
                        Position.Bias bias) {
        // Deliberately empty
    }

    @Override
    public int getNextVisualPositionFrom(JTextComponent component,
                                         int position,
                                         Position.Bias bias,
                                         int direction,
                                         Position.Bias[] newBias) {
        return position;
    }
});