Java Swing - 如何将游标放在PlainDocument的JTextField中

时间:2017-01-09 18:20:51

标签: java swing 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方法处理该字符并将其插入文本中。下一次操作时,光标位于文本末尾。如何将光标定位在原始位置?

2 个答案:

答案 0 :(得分:1)

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

阅读Implementing a DocumentFilter上的Swing教程中的部分以获取更多信息。

  

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

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

然后replaceSelection(...)方法中的逻辑类似于:

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

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

答案 1 :(得分:1)

控制插入位置不是Document的工作。您应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;
    }
});