[英]How can I limit JTextField input to just numbers and only 2 chars?
我正在尝试制作一个JTextField,它将仅允许数字输入并且仅允许两个字符(换句话说,将仅允许数字0-99)。 到目前为止,我已经看过一些教程,并试图将输入限制为仅数字。 到目前为止,我的代码存在的问题是可以接受所有关键输入。 我尝试反转大于和小于符号,并且它完全停止接受任何输入。 我认为问题出在关键字符代码上,但是有些帮助还是对的,因为我找不到任何有用的信息(我看上去的每个地方都有针对Java的不同按键映射)。
if(event.getSource() == txtMasterSound)
{
if(event.getKeyCode() < 0 || event.getKeyCode() > 9)
{
System.out.println("Your input was invalid");
event.consume();
}
else
{
System.out.println("Your input was valid");
return;
}
}
至于限制字符,我真的不知道从哪里开始,所以有些指向正确方向的人也很好。
例如,一个DoumentFilter
import javax.swing.*;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.PlainDocument;
public class MyDocFilter {
private static void createAndShowGUI() {
JTextField field1 = new JTextField(10);
PlainDocument doc = (PlainDocument) field1.getDocument();
doc.setDocumentFilter(new DocumentFilter() {
private boolean isValid(String testText) {
if (testText.length() > 2) {
return false;
}
if (testText.isEmpty()) {
return true;
}
int intValue = 0;
try {
intValue = Integer.parseInt(testText.trim());
} catch (NumberFormatException e) {
return false;
}
if (intValue < 0 || intValue > 99) {
return false;
}
return true;
}
@Override
public void insertString(FilterBypass fb, int offset, String text,
AttributeSet attr) throws BadLocationException {
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
sb.insert(offset, text);
if (isValid(sb.toString())) {
super.insertString(fb, offset, text, attr);
}
}
@Override
public void replace(FilterBypass fb, int offset, int length,
String text, AttributeSet attrs) throws BadLocationException {
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
int end = offset + length;
sb.replace(offset, end, text);
if (isValid(sb.toString())) {
super.replace(fb, offset, length, text, attrs);
}
}
@Override
public void remove(FilterBypass fb, int offset, int length)
throws BadLocationException {
StringBuilder sb = new StringBuilder();
sb.append(fb.getDocument().getText(0, fb.getDocument().getLength()));
int end = offset + length;
sb.delete(offset, end);
if (isValid(sb.toString())) {
super.remove(fb, offset, length);
}
}
});
JPanel panel = new JPanel();
panel.add(field1);
JFrame frame = new JFrame("MyDocFilter");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().add(panel);
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
这可能有点草率,但是您可以添加一个侦听器来检测更改(键入内容时),每次键入内容时,您都要检查键入的内容,如果不是0-9,则删除最后一个字符,如果有更多字符然后删除2个字符。
这可能会起作用(我还没有尝试过),但是我认为JFormattedTextField更专业。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.