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

回到顶部