gpt4 book ai didi

java - 将 JTextField 输入限制为整数

转载 作者:行者123 更新时间:2023-12-02 03:30:26 25 4
gpt4 key购买 nike

我知道这个问题肯定已经被问过并回答了一百万次,但我就是找不到一个简单的解决方案。我有一个 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

另外,有关教程帮助,请查看:Implementing a 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 输入限制为整数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56889022/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com