我知道这个问题一定已经被提出并回答了一百万遍了,但是我找不到一个简单的解决方案。我有一个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
}
}
}
为什么这很重要?
在java中,我试图制作简单的货币转换器,但为此,我需要一个文本字段,它可以将输入限制为仅数字,更重要的是双数字。我尝试过使用,但它只在您完成输入并单击其他位置后格式化输入,但我需要限制TextField在输入时使用()每个无效字符。 可能的尝试: 使用: 使用: 使用与regex: 第二次和第三次尝试很接近,但是第二次尝试在点值上失败了,第三次尝试总是读文本字段上的第一个字符,不管它是什么,所以
问题内容: 我是JAVA的新手,我正在尝试将JTextField的输入转换为整数,我尝试了很多选项,但是没有任何作用,蚀总是给我一个错误,并且这些错误对我来说没有意义。 导入java.awt.Graphics; 导入java.awt.Color; 问题答案: 代替: 试试这个: 您不能解析为,但是 可以解析 其包含的 值 -文本。
问题内容: 我想创建JTextField,输入字符限于“ abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVXYWZZ0123456789 +&@#/%?=〜_- |!:,。;”之类的输入字符。所以我尝试覆盖 但这不是我想要的,因为用户无法再按ctrl-c ctrl-v ctrl-x …所以我添加了 到if条件,但现在用户可以粘贴不适当的输入,即’(’
我试图限制用户可以在文本字段中输入的字符的最大长度,但似乎不起作用。 以下是代码: 我做错什么了吗?我怎样才能使限制正常工作?
下面是关于如何限制字符输入长度的代码 可以通过
问题内容: 我正在尝试进行多项选择调查,以允许用户从选项1-x中进行选择。如何做到这一点,以便用户输入除数字以外的任何字符,返回“那是无效答案”之类的内容 问题答案: 您的代码将变为: 它的工作方式是使循环无限循环,直到仅放入数字为止。因此,如果我输入“ 1”,它将破坏循环。但是如果我放“ Fooey!” 该语句将捕获“将引发的错误” ,并且该循环将循环,因为它没有被破坏。