1

在我的第一个程序上工作。我想出了如何识别我不想输入的字符。我想知道如何删除输入的最后一个字符,以便从用户的角度来看,它会显示为只能输入数字。

@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);
                } 
            }
        }

谢谢。 在此处输入图像描述

4

4 回答 4

4

最简单的方法是使用 JFormattedTextField 而不是 JTextField。

NumberFormat format = NumberFormat.getNumberInstance();
format.setMinimumFractionDigits(2); // eventually maximum fraction digits

JFormattedTextField fld = new JFormattedTextField(format);
于 2012-08-06T22:11:05.393 回答
4

keyListener在这种情况下,您应该避免使用 s。如果用户将文本粘贴到字段中会发生什么。将keyListener不会收到通知,允许插入无效字符。

您最好使用DocumentFilter过滤掉您不想要的任何无效字符。

查看实现 DocumentFilter以获取更多信息,并查看 DocumentFilter以获取一些不错的示例

于 2012-08-06T22:45:44.093 回答
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;
        }
于 2012-08-06T22:13:50.753 回答
1

下面是 JTextField 的创建:

hourlyWageInput = new JTextField("7.25");
DocumentFilter filter = new UppercaseDocumentFilter();
((AbstractDocument) hourlyWageInput.getDocument()).setDocumentFilter(filter);
hourlyWageInput.setHorizontalAlignment(JTextField.CENTER);
add(hourlyWageInput);

这是我的文档过滤器:

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 小时。

于 2012-08-07T02:43:03.627 回答