输入JTextField后,如何实时检查异常

时间:2014-10-26 17:13:10

标签: java exception

假设我有一个输入字段,只有在按下提交按钮时才接受Int

如果字段检查不是int,我该怎么说禁用按钮。

忽略Add Number按钮,它无关紧要。

enter image description here

enter image description here

2 个答案:

答案 0 :(得分:2)

可以像这样使用DocumentListener

    Document document = jTextFiled.getDocument();
    document.addDocumentListener(new DocumentListener() {

        @Override
        public void insertUpdate(DocumentEvent e) {
            check();
        }

        @Override
        public void removeUpdate(DocumentEvent e) {
            check();
        }

        @Override
        public void changedUpdate(DocumentEvent e) {
            check();
        }

        private void check() {
            if (!isInteger(jTextFiled.getText())) {
                jButton.setEnabled(false);
            } else {
                jButton.setEnabled(true);
            }
        }

    });

答案 1 :(得分:1)

正如其他人已经说过的那样,JFormattedTextField是最好的方法。您需要自定义格式化程序的valueToString方法,因为NumberFormat通常会忽略尾随字符:

final JButton acceptButton = new JButton("Add Volume");
acceptButton.setEnabled(false);

NumberFormat format = NumberFormat.getIntegerInstance();

NumberFormatter formatter = new NumberFormatter(format) {
    @Override
    public Object stringToValue(String text)
    throws ParseException {
        ParsePosition pos = new ParsePosition(0);
        Object value = getFormat().parseObject(text, pos);
        if (value != null && pos.getIndex() >= text.length()) {
            return value;
        }
        throw new ParseException(text, pos.getErrorIndex());
    }
};
formatter.setCommitsOnValidEdit(true);
formatter.setAllowsInvalid(true);

JFormattedTextField field = new JFormattedTextField(formatter);
field.setFocusLostBehavior(JFormattedTextField.COMMIT);

field.addPropertyChangeListener("editValid",
    new PropertyChangeListener() {
        @Override
        public void propertyChange(PropertyChangeEvent event) {
            boolean valid = (Boolean) event.getNewValue();
            acceptButton.setEnabled(valid);
        }
    });