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