使用InputVerifier设计Swing校验包
尽管有许多针对Swing的校验框架,并且Swing中也有API InputVerifier用于数据校验,InputVerifier易于使用并且容易定制。本文将在InputVerifier的基础上构建一个可用的校验包,可以在其它的Swing应用之中。
InputVerifier类在javax.swing包中。它有一个抽象方法,我们需要实现一个叫verify()的方法,这个方法接受一个JComponent作为参数,返回值为true或false。一旦我们实现了verify()方法,我们可以在JTextField中使用如下:
JTextField text = new JTextField();
Text.setInputVerifier(new MyVerifier());
然而,InputVerifier本身并没有什么意思。它的作用是防止用户输入错误的信息在组件中,阻止用户把输入光标移动到其他组件上。这种方式令人感到厌烦并且用户不知道错误所在。InputVerifier并没有提供一些更好的功能,所以我们需要构建一个如下校验包:
1. 如果数据不正确时,可以改变输入组件的背景颜色。
2. 如果数据不正确时,可以弹出消息提示用户错误出在什么地方,应该怎么处理。
3. 我们需要通知Form窗体每个组件的校验结果,这样的话Form窗体可以执行相应的动作。(例如启动”OK”按钮)
4. 如果用户改正了组件的错误数据,则错误提示信息应消失。
我们的包中包含一个抽象类,这个抽象类处理了大部分的工作,我们只需要实现一个方法,决定使用什么规则来进行数据校验;同时也提供一个接口,如果需要校验的Form窗体需要校验结果通知Form窗体,则可以实现该接口。好了,我们现在可以设计这个接口。
WantsValidationStatus接口
下面的接口可以提供一种方式用于出发Form窗体的制定事件。
package ica.swing.validation;
public interface WantsValidationStatus {
void validateFailed(); // Called when a component has failed validation.
void validatePassed(); // Called when a component has passed validation.
}
实现这个接口可以通知Form窗体校验状态,但是实现该接口不是必须的。我们也可以不是实现这个接口,如果校验失败不做任何事情。但是,我认为这样的设计是比较优美的。接下来看看我们的抽象类。
AbstractValidator类
AbstarctValidator处理了显示出错提示,改变出错背景,通知Form窗体等许多工作。只留下一个抽象的方法待实现,protected abstract Boolean validateCriteria(JComponent c),这个方法我们需要提供自己的校验规则用于校验组件。以下是抽象类:
protected abstract boolean validationCriteria(JComponent c);
public boolean verify(JComponent c) {
if (!validationCriteria(c)) {
c.setBackground(Color.PINK);
//messageLabel.setSize(0,0);
//messageLabel.setBackground(color);
point = c.getLocation();
double x =point.getX();
double y = point.getY();
Point p = new Point();
p.setLocation(x,y+c.getHeight());
tooltip= new HalfOpaqueToolTip(
message, new Color( 250 , 250 , 200 ), Color.RED, Color.BLACK, 1,dialog,p );
c.addMouseListener(tooltip);
return false;
}
Verify()方法
当需要校验是调用方法boolean verify(JComponent c),下面用一例子示之。
public class ToolTipsEmptyValidator extends ToolTipsAbstractValidator {
public ToolTipsEmptyValidator(JDialog dialog, JTextField c, String message) {
super(dialog, c, message);
}
public ToolTipsEmptyValidator(JFrame dialog, JTextField c, String message) {
super(dialog, c, message);
}
public ToolTipsEmptyValidator(JDialog dialog, JTextArea c, String message) {
super(dialog, c, message);
}
public ToolTipsEmptyValidator(JFrame dialog, JTextArea c, String message) {
super(dialog, c, message);
}
@Override
protected boolean validationCriteria(JComponent c) {
if (c instanceof JTextField){
if (((JTextField) c).getText().equals(""))
return false;
}
else if (c instanceof JTextArea){
if (((JTextArea) c).getText().equals(""))
return false;
}
return true;
}
}
调用方法如下:
ToolTipsEmptyValidator validator1 = new ToolTipsEmptyValidator(jDialog,localdbPanel.getIpAddressField(),"Error,IP Address can't be empty");
boolean flag1 = validator1.verify(localdbPanel.getIpAddressField());
下图是使用该校验包的示例。