我开发了一些计算器,所以在JTextField
上面只能有一些字符
实现这一目标的最佳方法是什么?
假设我有char[] values = 0,1,2,3,4,5,6,7,8,9,+,-,*,/,(,),.,
这些是用户可以输入的值。
答案 0 :(得分:3)
使用JFormattedTextField
。您可以将MaskFormatter
与setValidCharacters(...)
方法一起使用,并指定包含有效字符的字符串。
阅读Using a MaskFormatter上的Swing教程中的部分以获取更多信息。
或者另一种方法是使用带有DocumentFilter
的JTextField。有关详细信息,请阅读Implementing a DocumentFilter上的Swing教程。
答案 1 :(得分:2)
已经有几个像你一样的问题解决了:
Filter the user's keyboard input into JTextField (swing)
根据这些,你应该使用DocumentFilter或JFormattedTextField。
答案 2 :(得分:2)
最终我设法创建了我自己的JTextField
,其实现方式如下:
public class MyTextField extends JTextField {
//final value for maximum characters
private final int MAX_CHARS = 20;
/**
* A regex value which helps us to validate which values the user can enter in the input
*/
private final String REGEX = "^[\\d\\+\\/\\*\\.\\- \\(\\)]*$";
public MyTextField(){
//getting our text as a document
AbstractDocument document = (AbstractDocument) this.getDocument();
/**
* setting a DocumentFilter which helps us to have only the characters we need
*/
document.setDocumentFilter(new DocumentFilter() {
public void replace(FilterBypass fb, int offs, int length, String str, AttributeSet a) throws BadLocationException {
String text = fb.getDocument().getText(0, fb.getDocument().getLength());
text += str;
if ((fb.getDocument().getLength() + str.length() - length) <= MAX_CHARS && text.matches(REGEX)){
super.replace(fb, offs, length, str, a);
}
}
public void insertString(FilterBypass fb, int offs, String str, AttributeSet a) throws BadLocationException {
String text = fb.getDocument().getText(0, fb.getDocument().getLength());
text += str;
if ((fb.getDocument().getLength() + str.length()) <= MAX_CHARS && text.matches(REGEX)){
super.insertString(fb, offs, str, a);
}
}
});
}
}