0

我制作了一个 java 程序,它应该在 GUI 框架中从用户那里获取输入,并以行和列的形式存储在 .dat 文件中。问题在于这个特定的代码,因为它没有给出想要的结果。用户应该只能使用 keylistener 输入 20 到 30 之间的数字。输入不应接受任何超出此范围的数字,即 19 或 31。Eclipse 抛出错误“无效字符常量”。有什么出路吗?

// input validation that restricts user to enter specific number range between 20 and 30

txDeposit.addKeyListener(new KeyAdapter() {
    public void keyTyped(KeyEvent ke) {
        char c = ke.getKeyChar();
        if(!(ke.getKeyChar() >= '20' && ke.getKeyChar() <= '30')) {
            getToolkit().beep();
            ke.consume();
        }
    }
});
4

3 回答 3

0

您的代码无法编译,因为`` is used to mark characters, not string. Character constant consist of one and only one character only. Therefore'20'` 无效。

现在,据我了解,您想要捕获20 到 30 之间的数字。2 位数字由 2 位数字组成,因此您必须使验证更加复杂:如果第一个字符是2您必须等待 0 到 9 之间的字符,如果'3''0'允许第一个字符。

输入 2 个字符后,您必须重置状态并再次等待“2”或“3”。

我只是怀疑你真的想这样做。据我了解,您在文本字段中添加了侦听器,不是吗?在这种情况下,不要检查当前输入的字符。检查文本字段的内容:

int number = Integer.parseInt(tx.getText());
if (number < 20 || number > 30) {
    getToolkit().beep();
}
于 2013-05-21T07:00:38.133 回答
0

KeyListeners 在这种情况下是不可靠的,因为您无法保证侦听器的处理顺序。该字段可能在您之前已经处理了关键事件...

相反,您应该使用DocumentFilter

在这里查看示例

一个更简单的解决方案就是使用JSpinner

文档过滤器示例

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.GridBagLayout;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;

public class TestNumericFilter {

    public static void main(String[] args) {
        new TestNumericFilter();
    }

    public TestNumericFilter() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            JTextField field = new JTextField(3);
            ((AbstractDocument) field.getDocument()).setDocumentFilter(new IntFilter());
            setLayout(new GridBagLayout());
            add(field);
        }
    }

    public class IntFilter extends DocumentFilter {

        public void insertString(DocumentFilter.FilterBypass fb, int offset,
                String text, AttributeSet attr)
                throws BadLocationException {

            boolean valid = true;
            for (char c : text.toCharArray()) {
                if (!Character.isDigit(c)) {
                    valid = false;
                    break;
                }
            }

            if (valid) {

                int incoming = Integer.parseInt(text);
                int length = fb.getDocument().getLength();
                if (length == 0 && text.length() == 1) {
                    if (incoming >= 2 && incoming <= 3) {
                        super.insertString(fb, offset, text, attr);
                    } else {
                        Toolkit.getDefaultToolkit().beep();
                    }
                } else {
                    String value = fb.getDocument().getText(0, length) + text;
                    incoming = Integer.parseInt(value);
                    if (incoming >= 20 && incoming <= 30) {
                        super.insertString(fb, offset, text, attr);
                    } else {
                        Toolkit.getDefaultToolkit().beep();
                    }
                }
            }
        }

        public void replace(DocumentFilter.FilterBypass fb,
                int offset, int length, String string, AttributeSet attr) throws BadLocationException {
            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }
}
于 2013-05-21T06:55:13.427 回答
0

您可以使用扩展 JTextField 的预制 Java 组件。它提供长度限制和正则表达式检查。您可以轻松地使用该组件并添加正则表达式来限制数量。

您可以选择并轻松地编辑代码(特别是 insertString() 方法)并添加您自己的自定义检查。

您可以在此处查看有关它的博客文章https://subversivebytes.wordpress.com/2012/10/09/java-create-custom-regex-jtextfield/并且代码是完整的并且可以免费复制/粘贴

这只是“为什么要重新发明轮子”的事情之一......

于 2013-05-21T07:39:44.377 回答