【问题标题】:Java Swing: Implementing a validity check of input valuesJava Swing:实现输入值的有效性检查
【发布时间】:2012-10-11 10:54:52
【问题描述】:

在我的 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 或更多行(因为我不仅检查它是否是一个数字,而且如果number 在程序逻辑的上下文中是有意义的等等)。是否有 Swing 自己的方法来检查这些事情?或者有谁更好地了解如何使用拆分方法来准确实现此功能?

【问题讨论】:

    标签: java swing input


    【解决方案1】:

    一种解决方案是使用 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);
    

    【讨论】:

      【解决方案2】:

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

      与“单击按钮并查看错误消息出现”相比的主要好处:

      • 为用户提供即时反馈。如果 Web 应用程序可以避免往返服务器并使用 javascript 进行即时反馈,那么在桌面应用程序中没有理由不这样做。按下按钮进行验证是 90 年代的事。
      • 视觉反馈很重要,比 InputVerifier 更好,它只是避免改变焦点
      • 高度可重用的组件。只需确保您的“实用程序代码包”包含一堆 Formats(用于日期、双精度数、整数、范围等),您几乎可以处理任何情况
      • 由于使用Formats,可以轻松调整为不同的Locales
      • 您永远不需要解析JFormattedTextField 之后的输入。所有解析代码都包含在格式中,你可以简单地使用JFormattedTextField#getValue
      • 所有验证都由JFormattedTextField 负责。您知道您使用 getValue 检索的值是有效值

      【讨论】:

      • +1 必须说认为没有人能超越InputVerifier :) 完全忘记了JFormattedTextField
      【解决方案3】:

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

      否则会有处理这类事情的完整验证框架。我想说,它们很容易用谷歌搜索。

      【讨论】:

        【解决方案4】:

        您可以通过使用DocumentFilter获得实时验证

        您可以查看thisthis 了解一些示例。

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-12-25
          • 1970-01-01
          • 1970-01-01
          • 2018-05-23
          • 1970-01-01
          相关资源
          最近更新 更多