在 Java 中按下按钮之前验证输入

Validate input before pressing button in Java

我有一个自行创建的对话框,用于检查用户的输入。目前我可以让它验证一个空输入并在它是一个整数时正确解析用户输入,但是我在使用字符串验证时一直得到 NumberFormatException。添加一个尝试,catch 确实阻止了 JVM 崩溃,但输入随后为空。

public void initDialog() {
    dPanel = new JPanel();
    dPanel.setLayout(new BoxLayout(dPanel, BoxLayout.Y_AXIS));
    JLabel invalidInput = new JLabel("");
    String[] options = {"OK"};
    dPanel.add(new JLabel("Game default target is 101, enter a number below to change it"));
    dPanel.add(new JLabel("Leave blank to start with the default"));
    dPanel.add(invalidInput);
    JTextField text = new JTextField("");
    text.requestFocusInWindow();
    dPanel.add(text);

    int changeGameTarget = JOptionPane.showOptionDialog(null, dPanel, "Dice Game", JOptionPane.NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);

    dialogHandler(changeGameTarget, text, invalidInput);

    text.setText("");
}

对话框处理方法

   public boolean dialogHandler(int op, JTextField text, JLabel nonDigit) {

    String s = text.getText();

    try {
        if (op == JOptionPane.OK_OPTION) {
            if (s.isEmpty()) {
                target = 101;
            } else {
                target = Integer.parseInt(s);
            }
        }
    } catch (NumberFormatException ex){
        nonDigit.setText("This is not a number");
        return false;
    }

    return true;
}

好的,解决你的问题应该很简单:

首先,您将方法签名更改为

public boolean dialogHandler(int op, JTextField text, JLabel nonDigit)

这允许您 return 输入是好 (true) 还是坏 (false)。 然后你只需用 try-catch 块包围你的方法并捕获 NumberFormatException。如果捕获到异常,return false,否则 return true.

那你只需要这样写,当方法的结果为false时,用户需要输入其他的东西。

让我们在解析中使用 Try-Catch 作为 if-else 并将方法更改为布尔值,这样你就可以做到主循环。

public boolean dialogHandler(int op, JTextField text, JLabel nonDigit) {

  String s = text.getText();

  if (op == JOptionPane.OK_OPTION) {
    if (s.isEmpty()) {
      return false; // If the text is empty we return false for the flag.
    } else {
      try {
        target = Integer.parseInt(s);
        return true; // If parse was succesful, we return true for the flag.
      } catch (Exception e) { 
        return false; // If the exception happened, return false for the flag.
      }
    }
  } else if (op == JOptionPane.CLOSED_OPTION) {
    System.exit(0);
  }
}

然后我们改main:

boolean flag;
do {
  int changeGameTarget = JOptionPane.showOptionDialog(null, dPanel, "Dice Game", JOptionPane.NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, options, options[0]);
  flag = dialogHandler(changeGameTarget, text, invalidInput);
} while (!flag);