Java Swing:实现输入值的有效性检查

时间:2012-10-21 12:19:34

标签: java swing input

在我的Swing应用程序中,用户必须插入数字和值,然后才能切换到下一个窗口。现在作为一个干净的程序,我检查每个输入是否有效,如果没有,则显示错误消息,下一个窗口不会打开。

此检查的结构如下(示例):

Button buttonToOpenNextWindow = new JButton("next");
button.addActionListener(new ActionListener(){

    public void actionPerformed(ActionEvent e){
        if(checkValidty){
            // (...)
            new WindowA();
            frame.dispose(); // (*)
        }
    }
});

(*)注意:我知道多个JFrame的原理是丑陋的,我正在改变它,但对于这个问题它是无关紧要的。

现在这个问题的重点是checkValidity(),我的结构是这样的:

private boolean checkValidity(){

    // check input 1
    try{
        Integer.parseInt(textField1.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input 1 is invalid!"); // own implemented dialog
        return false;
    }

    // check input 2
    try{
        Integer.parseInt(textField2.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input 2 is invalid!"); // own implemented dialog
        return false;
    }

    // (...)

    // check input n
    try{
        Integer.parseInt(textField_n.getText());
    }catch (NumberFormatException e){
        new ErrorDialog("input n is invalid!"); // own implemented dialog
        return false;
    }
    return true;
}

这完全符合我的要求,但代码本身非常难看,因为有多个输入选项,该方法获得200,300或更多行(因为我不仅检查它是否是一个数字,而且如果数字在程序逻辑的上下文中是有意义的等等)。是否有Swing -own方法来检查这些事情?或者有谁更好地了解如何使用拆分方法实现这一功能?

4 个答案:

答案 0 :(得分:16)

一种解决方案是使用Swing的InputVerifier来验证所使用的每个JTextField的输入。由于每个字段的验证功能相同,因此可以将单个实例用于所有组件:

public class MyNumericVerifier extends InputVerifier {
    @Override
    public boolean verify(JComponent input) {
       String text = ((JTextField) input).getText();
       try {
          Integer.parseInt(text);
       } catch (NumberFormatException e) {
          return false;
       }

       return true;
    }
}

InputVerifier verifier = new MyNumericVerifier()
textField1.setInputVerifier(verifier);

答案 1 :(得分:7)

我更喜欢使用JFormattedTextField的改进版本。通过改进,我的意思是更好的插入符号行为,对每个更改进行验证以提供即时用户反馈(例如,当输入无效时更改背景颜色),....这与一个禁用的按钮相结合,直到输入有效。

“点击按钮并看到错误消息”的主要好处是:

  • 对用户的即时反馈。如果网络应用程序可以避免往返服务器并使用javascript立即反馈,那么没有理由不在桌面应用程序中使用它。按下按钮进行验证是'90。
  • 视觉反馈很重要,比InputVerifier更好,只是避免改变焦点
  • 高度可重复使用的组件。只要确保你的'实用程序代码包'包含一堆Format s(对于日期,双精度,整数,范围......),你几乎可以处理任何情况
  • 由于使用了Format s,因此可以针对不同的Locale s轻松调整
  • 您永远不需要在JFormattedTextField之后解析输入。所有解析代码都包含在格式中,您只需使用JFormattedTextField#getValue
  • 即可
  • 所有验证都由JFormattedTextField处理。您知道使用getValue检索的值是有效的

答案 2 :(得分:3)

你可以做很多事情。一个简单的方法是使用一种方法来检查字符串列表的可解析性为int。对于其他检查,您可以使用更多方法检查一些典型的事物,例如数字范围。因此,将每种检查分成自己的方法,并根据需要进行组合。

否则就会有完整的验证框架来处理这类事情。我会说,它们很容易上网。

答案 3 :(得分:2)

您可以通过使用DocumentFilter

进行实时验证

您可以查看thisthis以获取一些示例。

但我认为,在这种情况下,您可能会发现JFormattedTextField是更合适的解决方案。