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

2019-07-01 14:09发布

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

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

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

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

(*)注:我知道,多JFrames的原则是丑,我在改变这种状况,但对于这个问题,这是无关紧要的。

现在,这个问题的焦点是这个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或更多的线长(因为我不只是检查是否例如,它是一个数字,而且如果该号码是有道理的在程序逻辑等)的上下文。 是否有一个秋千-own方法来检查这样的事情? 或者有没有人一个更好的主意如何实现与分裂法正是这种功能?

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


Answer 2:

我更喜欢使用的一个改进版JFormattedTextField 。 通过改进我的意思是更好的插入符的行为,确认每个变化提供即时的用户反馈(例如改变背景颜色,当输入无效),......。 与一个按钮,被禁用,直到输入是有效的组合。

在“按一下按钮,看看出现错误信息”主要优势:

  • 即时反馈给用户。如果Web的应用程序可避免往返到服务器,并使用JavaScript进行即时反馈,对于不具有在桌面应用程序没有任何借口。 按下一个按钮,以验证是如此'90。
  • 视觉反馈是非常重要的,更好的则InputVerifier这只是避免改变焦点
  • 高度可重用的组件。 只要确保你的效用代码包“中包含了一堆的Format S(日期,双打,整数,范围,......),你可以处理几乎任何情况
  • 由于使用的Format S,容易调节以不同Locale小号
  • 你永远需要后解析输入JFormattedTextField 。 所有的解析代码包含在格式,你可以简单地使用JFormattedTextField#getValue
  • 所有的验证是由照顾JFormattedTextField 。 你知道你找回使用值getValue是一个有效的


Answer 3:

有很多事情可以做。 一个简单的一个是具有用于检查parseability转换成int字符串列表的方法。 对于额外的检查,你就会有更多的方法是检查一些典型的东西,像数范围。 因此,各种检查的分割成其自己的方法,并根据需要撰写他们。

否则,是处理这种事情完全验证框架。 他们是easiliy googlable,我会说。



Answer 4:

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

你看看这和这一些例子。

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



文章来源: Java Swing: Implementing a validity check of input values
标签: java swing input