当前位置: 首页 > 知识库问答 >
问题:

如何在Swing中验证用户的输入?

白星海
2023-03-14

我已经创建了一个控制台应用程序,现在开始将其转换为摇摆应用程序。我有一个问题,我搜索了很多次,但我没有找到任何答案。

我的应用程序有一个类来验证用户的输入,如果输入错误,它会向控制台发出错误消息。所以我尝试做的是,我有一个Jtextfield并验证这个输入,如果输入错误,它应该给我错误消息。

这是我的Input类,用户可以在其中编写

public class Input {

    private static BufferedReader eingabe = new BufferedReader(new InputStreamReader(System.in));
    private Output output = new Output();

    private static String captureText() throws Exception {
        return eingabe.readLine();
    }
    public String formatInput() {
        boolean again = true;

        while (again) {
            try {
                String format = captureText();

                if (!format.equalsIgnoreCase("Y") && !format.equalsIgnoreCase("N")) {
                    again = true;
                    throw new Exception();
                }
                again = false;
                return format;
            } catch (Exception e) {
                this.output.formatInputWrong();
            }
        }
        return null;

    }
}

这是我的输出类方法

void formatInputWrong() {
    System.out.print("\nThe Format Input is wrong.");

}

我只是想知道我可以使用输入类的验证,还是应该为swing输入验证创建一个特殊的类,因为我知道我可以取出JTextfield的输入

共有1个答案

连志义
2023-03-14

您的错误消息现在显示在控制台上。看起来您希望消息显示在GUI中。如如何使用焦点子系统:验证输入所示,InputVerifier是一个不错的选择。由于您的shouldYieldFocus()实现允许产生副作用,因此可以根据需要更新状态显示。从这个完整的示例开始,下面的变体添加了一个标签,并根据调用verify()的结果将其置于shouldYieldFocus()中。

private static final String OK = "Values OK.";
private JLabel status = new JLabel(OK, JLabel.CENTER);
…
if (verify(input)) {
    …
    status.setText(OK);
    return true;
} else {
    …
    status.setText("Please enter a number.");
    return false;
}

如这里所建议的,一种补充方法可能包括一个文档监听器(DocumentListener)。

import java.awt.*;
import javax.swing.*;

/**
 * @see http://stackoverflow.com/a/44861290/230513
 * @see http://stackoverflow.com/a/11818183/522444
 */
public class VerifierEg {

    private static final String ZERO = "0.0";
    private static final String OK = "Values OK.";
    private JTextField field1 = new JTextField(ZERO, 5);
    private JTextField field2 = new JTextField(ZERO, 5);
    private JTextField resultField = new JTextField(ZERO, 10);
    private JLabel status = new JLabel(OK, JLabel.CENTER);

    private void createAndShowGui() {
        resultField.setEditable(false);
        resultField.setFocusable(false);

        JPanel mainPanel = new JPanel();
        final JTextField[] fields = {field1, field2};

        mainPanel.add(field1);
        mainPanel.add(new JLabel(" x "));
        mainPanel.add(field2);
        mainPanel.add(new JLabel(" = "));
        mainPanel.add(resultField);

        for (JTextField field : fields) {
            field.setInputVerifier(new MyInputVerifier(field));
        }

        JFrame frame = new JFrame("VerifierEg");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.add(mainPanel);
        frame.add(status, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationByPlatform(true);
        frame.setVisible(true);
    }

    private void calcProduct() {
        double d1 = Double.parseDouble(field1.getText());
        double d2 = Double.parseDouble(field2.getText());
        double prod = d1 * d2;
        resultField.setText(String.valueOf(prod));
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                VerifierEg eg = new VerifierEg();
                eg.createAndShowGui();
            }
        });
    }

    /**
    * @see http://stackoverflow.com/a/11818946/230513
    */
    private class MyInputVerifier extends InputVerifier {

        private JTextField field;
        private double value;

        public MyInputVerifier(JTextField field) {
            this.field = field;
        }

        @Override
        public boolean shouldYieldFocus(JComponent input) {
            if (verify(input)) {
                field.setText(String.valueOf(value));
                calcProduct();
                status.setText(OK);
                return true;
            } else {
                field.setText(ZERO);
                field.selectAll();
                status.setText("Please enter a number.");
                return false;
            }

        }

        @Override
        public boolean verify(JComponent input) {
            try {
                value = Double.parseDouble(field.getText());
                return true;
            } catch (NumberFormatException e) {
                return false;
            }
        }
    }
}
 类似资料:
  • 我正在做一个简单的程序,要求用户输入0-19之间的五个数字。我想在每个数字后面添加一些东西(比如if语句),以确保它在这个范围内。如果不是,程序应该说“请再读指令”,然后system.exit(0)。这段代码是相关的: 如有任何帮助,将不胜感激。

  • 问题内容: Python如何接受用户输入,并验证? 问题答案: 完成此操作的最简单方法是将方法置于循环中。当输入错误时使用,当你感到满意时使用。 当你的输入可能引发异常时 使用和检测用户何时输入了无法解析的数据。 实施你自己的验证规则 如果要拒绝Python可以成功解析的值,则可以添加自己的验证逻辑。 结合异常处理和自定义验证 以上两种技术都可以组合成一个循环。 将其全部封装在一个函数中 如果你需

  • 问题内容: 因此,我几乎搜索了单词“ string”,“ python”,“ validate”,“ user input”等等的每个排列,但是我还没有找到一种适合我的解决方案。 我的目标是提示用户是否要使用字符串“ yes”和“ no”进行另一笔交易,我认为字符串比较在Python中是一个相当简单的过程,但是有些不起作用对。我使用的是Python 3.X,据我所知,输入应使用字符串而不使用原始输

  • 这是我刚接触Python时就一直在阅读的一本书中的一些代码……这一部分按它应该的方式工作 我的困境是…我需要验证输入是什么…因此,如果用户输入的是一个字符串(比如“五”而不是数字),而不是q或数字,它会告诉他们“很抱歉,“五”是无效的。请重试…然后它会再次提示用户输入。我是Python新手,一直在为这个简单的问题绞尽脑汁 *更新**因为我没有足够的积分来为我自己的问题添加答案,所以我在这里发布这个

  • 我的页面中有h: selectOneMenu组件。用户必须在那里选择“是”或“否”,初始值为null(标记为“未知”)。在bean中它是布尔值,因此可以为null。如果用户选择了有效值,例如“是”,则点击Next,保存在bean中。 现在用户可以返回此页面,并选择“未知”,这不是一个有效的值。当用户现在点击下一步时,会显示错误消息。可以,但值会更改为“是”。它从bean更新。这样它会更改用户输入的

  • 我试图理解如何使用JAAS保护JavaEE应用程序。 事实上,我知道如何在EJB中使用规则,但是,我不知道如何在web层中验证用户,例如创建一个简单的JSF页面,使用登录表单,检查给定的用户名 通常的做法是什么?我希望有尽可能多的独立解决方案。