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



我的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 方法处理 haracter 并将其插入文本中。接下来的操作,光标位于文本的末尾。如何将光标定位在原始位置?

您可能需要

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

有关详细信息,请阅读 Swing 教程中有关实现文档筛选器的部分。

如何将光标定位在原始位置?

创建自定义DocumentFilter类时,需要传入使用 Document 作为参数的文本字段,并将此文本字段另存为类的实例变量。

然后,replaceSelection(...)方法中的逻辑将是这样的:

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

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

控制插入符号位置不是文档的工作。 您应该设置一个导航过滤器,该过滤器忽略对插入符号位置的所有更改:

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

最新更新