参与我的第一个项目。我想出了如何识别我不想输入的字符。我想知道如何删除输入的最后一个字符,以便从用户透视它,它将显示为只能输入数字。
@Override
public void keyPressed(KeyEvent e) {
char keyChar = e.getKeyChar();;
char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`~!@#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray();
for (int i = 0; i < badCharArray.length; i++) {
if (badCharArray[i] == keyChar) {
System.out.print(badCharArray[i] + " bad\n");
hourlyWageInput.setBackground(Color.RED);
}
}
}
感谢。
答案 0 :(得分:4)
最简单的方法是使用JFormattedTextField而不是JTextField。
NumberFormat format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(2); // eventually maximum fraction digits
JFormattedTextField fld = new JFormattedTextField(format);
答案 1 :(得分:4)
在这种情况下,您应该避免使用keyListener
。如果用户将文本粘贴到字段中会发生什么。将不会通知keyListener
,允许插入无效字符。
您最好使用DocumentFilter过滤掉您不想要的任何无效字符。
请查看Implementing a DocumentFilter以获取更多信息,并DocumentFilter查看一些不错的示例
答案 2 :(得分:1)
只需将其文本设置为当前文本,而不在插入位置之前使用该字符
@Override
public void keyReleased(KeyEvent paramKeyEvent) {
char keyChar = paramKeyEvent.getKeyChar();
char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`~!@#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray();
for (int i = 0; i < badCharArray.length; i++) {
if (badCharArray[i] == keyChar) {
int caret = field.getCaretPosition()-1;
System.out.print(badCharArray[i] + " bad\n");
field.setText(field.getText().substring(0, caret) +
field.getText().substring(caret+1));
field.setCaretPosition(caret);
}
}
}
将其设置为红色,就好像你要自动修正它一样,没有任何意义(可能将它设置为显示红色一秒钟?)
实际上,唯一的问题是,如果他们持有无效密钥,它只会删除最后一个密钥;以下应该可以更好地工作,并且不会改变插入符:P
boolean held = false;
private int oldCaret = 1;
@Override
public void keyPressed(KeyEvent e) {
if(! held) {
oldCaret=field.getCaretPosition();
System.out.println(oldCaret);
}
held = true;
}
@Override
public void keyReleased(KeyEvent paramKeyEvent) {
char keyChar = paramKeyEvent.getKeyChar();
char[] badCharArray = "abcdefghijklmnopqrstuvwxyz-`~!@#$%^&*()[]{}<>_+=|\"':;?/ ".toCharArray();
for (int i = 0; i < badCharArray.length; i++) {
if(field.getText().contains(badCharArray[i]+"")) {
field.setText(field.getText().replace(badCharArray[i]+"", ""));
field.setCaretPosition(oldCaret);
}
}
held=false;
}
答案 3 :(得分:0)
这是JTextField的创建:
hourlyWageInput = new JTextField("7.25");
DocumentFilter filter = new UppercaseDocumentFilter();
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter);
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER);
add(hourlyWageInput);
这是我的DocumentFilter:
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
public class UppercaseDocumentFilter extends DocumentFilter {
public void replace(DocumentFilter.FilterBypass fb, int offset, int length,
String text, javax.swing.text.AttributeSet attr)
throws BadLocationException {
fb.insertString(offset, text.replaceAll("\\D", ""), attr);
}
}
这样可以自动删除JTextField中的所有字母和字符。谢谢,这是最好的。
然而,我想知道是否有人知道所有命令类似于“\ D”的地方。我花了一段时间才找到正确的信息。
此外,我现在的代码也阻止了。当我正在与双打合作时,我需要的类型。有什么想法吗?
感谢所有帮助,我今天学到了多少惊喜。已编码13个小时。