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

Java Swing-如何将光标定位在PlainDocument中的JTextField内,java,swing,jtextfield,Java,Swing,Jtextfield,我的JavaSwing应用程序有一个JText。我使用一个PlainDocument子类进行输入操作 public class MaskDecimalDocument extends PlainDocument { public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { //manipulation input code super

我的JavaSwing应用程序有一个JText。我使用一个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方法将处理该字符并将其插入文本中。接下来,光标将定位在文本的末尾。如何将光标定位在原始位置

> p>您可能需要考虑使用<代码>文档过滤器>代码>,因为它是处理<代码>文档< /代码>的最新API。这个概念是相同的,但类更易于重用,因为它可以添加到任何
文档中

有关更多信息,请阅读上的Swing教程部分

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

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

然后,
replaceSelection(…)
方法中的逻辑如下:

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

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

,您可能需要考虑使用<代码>文档过滤器> />代码>,因为它是处理<代码>文档< /代码>的最新API。这个概念是相同的,但类更易于重用,因为它可以添加到任何
文档中

有关更多信息,请阅读上的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;
    }
});

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

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