Java Swing - 如何将光标定位在 PlainDocument 中的 JTextField 中
Java Swing - How to position cursor inside JTextField from PlainDocument
我的 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方法处理该字符并将其插入到文本中。下一次操作,光标位于文本的末尾。如何将光标定位在原来的位置?
您可能要考虑使用 DocumentFilter
,因为它是较新的 API 来处理对 Document
的更改。概念是相同的,但 class 更可重用,因为它可以添加到任何 Document
.
阅读 Implementing a DocumentFilter 上的 Swing 教程部分了解更多信息。
How do I position the cursor at original place ?
当您创建自定义 DocumentFilter
class 时,您需要传入使用 Document
作为参数的文本字段并将此文本字段保存为的实例变量你的 class.
那么 replaceSelection(...)
方法中的逻辑类似于:
int caretPosition = textField.getCaretPosition();
super.replaceSelection(...);
textField.setCaretPosition( caretPosition );
请注意,您可能需要将 setCaretPosition(...)
方法放在 SwingUtilities.invokeLater()
中,以确保代码在设置插入符号位置的默认处理后执行。
控制插入符位置不是文档的工作。您应该 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;
}
});
我的 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方法处理该字符并将其插入到文本中。下一次操作,光标位于文本的末尾。如何将光标定位在原来的位置?
您可能要考虑使用 DocumentFilter
,因为它是较新的 API 来处理对 Document
的更改。概念是相同的,但 class 更可重用,因为它可以添加到任何 Document
.
阅读 Implementing a DocumentFilter 上的 Swing 教程部分了解更多信息。
How do I position the cursor at original place ?
当您创建自定义 DocumentFilter
class 时,您需要传入使用 Document
作为参数的文本字段并将此文本字段保存为的实例变量你的 class.
那么 replaceSelection(...)
方法中的逻辑类似于:
int caretPosition = textField.getCaretPosition();
super.replaceSelection(...);
textField.setCaretPosition( caretPosition );
请注意,您可能需要将 setCaretPosition(...)
方法放在 SwingUtilities.invokeLater()
中,以确保代码在设置插入符号位置的默认处理后执行。
控制插入符位置不是文档的工作。您应该 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;
}
});