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

时间:2015-12-12 11:49:18

标签: java joptionpane numberformatexception

我有一个自己创建的对话框,应该检查用户的输入。目前我可以让它验证一个空输入,并在它是一个Integer时正确解析用户输入,但是在使用String进行验证时我会继续得到NumberFormatException。添加try,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;
}

2 个答案:

答案 0 :(得分:1)

让我们在解析中使用 Try-Catch 作为 if-else 并将方法更改为boolean,这样你就可以在主

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);
  }
}

然后我们改变主要:

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);

答案 1 :(得分:0)

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

首先,将方法签名更改为

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

这使您可以返回良好的输入(true)或坏(false)。 然后,您只需使用try-catch块包围您的方法,然后抓住NumberFormatException。如果捕获到异常,则返回false,否则返回true

然后你只需要在方法的结果为false时写入,用户必须输入其他内容。