Java 将JTextField输入限制为整数
我知道这个问题一定已经被提出并回答了一百万遍了,但是我找不到一个简单的解决方案。我有一个JTextField,它只接受正整数作为输入。我需要一种方法来确保此处没有其他输入。
我已经有一个keyListener
附加到此控件。删除此侦听器在那里要处理的其他代码,我得到了:
txtAnswer.addKeyListener(new KeyAdapter() { @Override
public void keyPressed(KeyEvent e) {
int key = e.getKeyCode();
/* Restrict input to only integers */
if (key < 96 && key > 105) e.setKeyChar('');
};
});
如你所见,我正在尝试使用KeyCode
来检查刚刚按下的键是否在整数范围内。这似乎有效。但是我想做的就是,如果该条目不在此范围内,则只需忽略该条目。该代码e.setKeyChar('')
本来可以处理此问题,但是它不起作用。该代码将编译,但没有可见效果。
谁能告诉我我走的路是否正确?我可以用什么代替e.setKeyChar('')
以使其工作?还是我完全朝错误的方向前进?
回答:
请勿为此使用KeyListener,因为你会错过很多内容,包括粘贴文本。同样,KeyListener是一个非常低级的构造,因此在Swing应用程序中应避免使用它。
SO上已经多次描述了该解决方案:使用DocumentFilter。这个站点上有几个示例,其中一些是我写的。
例如:using-documentfilter-filterbypass
同样对于教程帮助,请查看:实现DocumentFilter。
编辑
例如:
import javax.swing.JOptionPane;import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.Document;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
public class DocFilter {
public static void main(String[] args) {
JTextField textField = new JTextField(10);
JPanel panel = new JPanel();
panel.add(textField);
PlainDocument doc = (PlainDocument) textField.getDocument();
doc.setDocumentFilter(new MyIntFilter());
JOptionPane.showMessageDialog(null, panel);
}
}
class MyIntFilter extends DocumentFilter {
@Override
public void insertString(FilterBypass fb, int offset, String string,
AttributeSet attr) throws BadLocationException {
Document doc = fb.getDocument();
StringBuilder sb = new StringBuilder();
sb.append(doc.getText(0, doc.getLength()));
sb.insert(offset, string);
if (test(sb.toString())) {
super.insertString(fb, offset, string, attr);
} else {
// warn the user and don't allow the insert
}
}
private boolean test(String text) {
try {
Integer.parseInt(text);
return true;
} catch (NumberFormatException e) {
return false;
}
}
@Override
public void replace(FilterBypass fb, int offset, int length, String text,
AttributeSet attrs) throws BadLocationException {
Document doc = fb.getDocument();
StringBuilder sb = new StringBuilder();
sb.append(doc.getText(0, doc.getLength()));
sb.replace(offset, offset + length, text);
if (test(sb.toString())) {
super.replace(fb, offset, length, text, attrs);
} else {
// warn the user and don't allow the insert
}
}
@Override
public void remove(FilterBypass fb, int offset, int length)
throws BadLocationException {
Document doc = fb.getDocument();
StringBuilder sb = new StringBuilder();
sb.append(doc.getText(0, doc.getLength()));
sb.delete(offset, offset + length);
if (test(sb.toString())) {
super.remove(fb, offset, length);
} else {
// warn the user and don't allow the insert
}
}
}
为什么这很重要?
- 如果用户使用复制和粘贴将数据插入文本组件怎么办?KeyListener可以错过吗?
- 你似乎希望检查数据是否可以表示int。如果他们输入了不合适的数字数据怎么办?
- 如果要允许用户以后输入重复数据怎么办?用科学计数法?
以上是 Java 将JTextField输入限制为整数 的全部内容, 来源链接: utcz.com/qa/431652.html