【问题标题】:Adding Swing Validation添加 Swing 验证
【发布时间】:2014-03-20 23:24:53
【问题描述】:

我正在尝试向我的 Java Swing 应用程序添加一些验证。我有多个JCheckBoxes,必须至少选中一个才能进入下一个屏幕,否则会显示一个对话框。下一个按钮将用户带到继续页面。我的问题是如何在JCheckBoxes 上实施验证。

我的 GUI swing 应用程序:http://postimg.org/image/dvpyfxavt/

【问题讨论】:

  • 你的问题是什么?
  • 我的问题是如何在 jcheck 框上实现验证。
  • 如果方框没有打勾,应该会出现一个对话框。
  • Swing 是事件驱动的,你什么时候想要这个?当按下按钮时?
  • 点击下一个按钮时...

标签: java swing validation user-interface


【解决方案1】:

你可以

您可以对每个JCheckBox 使用ActionListener,并根据所选JCheckBox 的数量更改JButton 的状态。

看看How to Use Buttons, Check Boxes, and Radio ButtonsHow to Write an Action Listener

基本上,这个ActionListener 将是您的JCheckBoxs 之间的共享实例,其唯一目的是确定实际选择了多少。为了使这更容易,我将创建一个数组或List 并将所有JCheckBoxs 添加到其中。这样您就可以简单地迭代复选框列表,直到找到一个选定的复选框...

你可以...

使用InputVerifier 来验证复选框失去焦点时的状态。如需更多信息,请参阅Validating Input

这种方法的唯一问题是......

  1. 每个组件只能有一个验证器。是的,您可以编写一个执行多项工作的验证程序,但这就是问题所在,一个验证程序应该只完成一项工作。
  2. 组件必须在验证过程发生之前放松焦点。这似乎没什么大不了的,但是如果用户坐在那里,“我已经检查了所有按钮,为什么按钮没有启用”,他们可能没有意识到他们必须更改焦点上下文才能进行验证...

【讨论】:

  • @nachokk 这只是另一种方法。我喜欢实时反馈,我讨厌点击“下一步”并看到“你没有做这样那样”的错误......看着你的网络表单>|
  • 没错,但InputVerifier在这种情况下也是一个不错的选择。
  • @nachokk - 为什么我总是认为InputVerfier 只用于文本组件:P
【解决方案2】:

您必须为您的按钮添加一个事件侦听器,如果您想走得更远,更昂贵的是ActionListener,您可以使用Action 接口,其行为类似于具有有用常量和方法的按钮控制器。

ActionListener 示例:

myButton.addActionListener(new ActionListener(){
        @Override 
        public void actionPerformed(ActionEvent evt){
            // make validations here, if validation not passed
            // show the dialog you can use -->
            // JOptionPane.showMessageDialog(null,"Error happen!");
            //else you have to switch to another view
        }

}) 

更多信息和更好的例子:How to use buttons


下一个完全是个人的,当我必须在按下按钮时验证表单时,我想在另一个类中分离验证逻辑。我制作了定义validate() 方法的自定义界面

public interface FieldValidator{
 final String MY_VALIDATOR = "myValidator";
 void validate() throws ValidationException
 //Note: ValidationException is a custom exception
}

JComponent 中,我想验证一个我定义自定义验证器的文本字段。

textfield.putClientProperty(FieldValidator.VALIDATOR, new FieldValidator(){
             @Override
            public void validate() throws ValidationException{
                if(textfield.getText().isEmpty())
                       throw new ValidationException("text is empty");
            }

});

一个包含表单中所有 JComponent 的具体类。

public MyValidator 实现 FieldValidator{ 私有最终 JComponent[] 组件;

public MyValidator(JComponent ... components){
   this.components=components;
}

@Override
public void validate() throws ValidationException{
    for(JComponent component : components){
        ((FieldValidator)component.getClientProperty(VALIDATOR)).validate();
    }
}

}

然后在客户端代码中

 FieldValidator fieldsValidator = new MyValidator(checkbox1,checkbox2,textfield);
    button.addActionListener(new ActionListener(){
        @Override
        public void actionPerformed(ActionEvent evt){
               try{
                    fieldsValidator.validate();
                    //all it's ok change the view
                }catch(ValidationException ex){
                   JOptionPane.showMessageDialog(null,"Error happen");// error happen
                }
        }
    });

【讨论】:

  • 感谢您的建议,当您说//在此处进行验证时,如果有问题。你介意澄清一下吗?
  • 验证未通过时
猜你喜欢
  • 1970-01-01
  • 2011-09-07
  • 2015-01-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
相关资源
最近更新 更多