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