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

Java 输入JTextField后,如何实时检查异常,java,exception,Java,Exception,假设我有一个输入字段,当按下submit按钮时,它只接受Int 如果字段检查不是int,我怎么能说禁用按钮呢 忽略添加号码按钮,它与此无关 您可以像这样使用DocumentListener: Document document = jTextFiled.getDocument(); document.addDocumentListener(new DocumentListener() { @Override public void insert

假设我有一个输入字段,当按下submit按钮时,它只接受
Int

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

忽略
添加号码按钮,它与此无关


您可以像这样使用
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);
            }
        }

    });

您可以像这样使用
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);
            }
        }

    });

您可以像这样使用
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);
            }
        }

    });

您可以像这样使用
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);
            }
        }

    });

正如其他人已经说过的,这是最好的方法。您需要自定义格式化程序的
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);
        }
    });

正如其他人已经说过的,这是最好的方法。您需要自定义格式化程序的
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);
        }
    });

正如其他人已经说过的,这是最好的方法。您需要自定义格式化程序的
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);
        }
    });

正如其他人已经说过的,这是最好的方法。您需要自定义格式化程序的
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);
        }
    });


我相信一定有一些onkeypress事件,你可以捕获并检查输入是否有效。啊,这是一个很好的观点,我会研究它的。谢谢。很多方法。写一些特别的代码。使用一个。使用文档过滤器。制作您自己的自定义文档。等等。您可以使用
JFormattedTextField
No,这可能是解决此特定问题的最佳选择。我认为试图嗅出关键事件是邪恶的。永远不要这样做,这是一个巨大的混乱。我相信一定有某种onkeypress事件,你可以捕获并检查输入是否有效。啊,这是一个很好的观点,我会研究它的。谢谢。很多方法。写一些特别的代码。使用一个。使用文档过滤器。制作您自己的自定义文档。等等。您可以使用
JFormattedTextField
No,这可能是解决此特定问题的最佳选择。我认为试图嗅出关键事件是邪恶的。永远不要这样做,这是一个巨大的混乱。我相信一定有某种onkeypress事件,你可以捕获并检查输入是否有效。啊,这是一个很好的观点,我会研究它的。谢谢。很多方法。写一些特别的代码。使用一个。使用文档过滤器。制作您自己的自定义文档。等等。您可以使用
JFormattedTextField
No,这可能是解决此特定问题的最佳选择。我认为试图嗅出关键事件是邪恶的。永远不要这样做,这是一个巨大的混乱。我相信一定有某种onkeypress事件,你可以捕获并检查输入是否有效。啊,这是一个很好的观点,我会研究它的。谢谢。很多方法。写一些特别的代码。使用一个。使用文档过滤器。制作您自己的自定义文档。等等。您可以使用
JFormattedTextField
No,这可能是解决此特定问题的最佳选择。我认为试图嗅出关键事件是邪恶的。永远不要那样做,这是一个巨大的混乱。他“可以”,不应该。前面提到的JFormattedTextField可能是一个更好的主意。他“可以”,不应该。前面提到的JFormattedTextField可能是一个更好的主意。他“可以”,不应该。前面提到的JFormattedTextField可能是一个更好的主意。他“可以”,不应该。前面提到的JFormattedTextField可能是一个更好的主意。