qiyadeng

专注于Java示例及教程
posts - 84, comments - 152, trackbacks - 0, articles - 34

使用InputVerifier设计Swing校验包

Posted on 2008-07-27 10:43 qiyadeng 阅读(2075) 评论(1)  编辑  收藏

使用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());

下图是使用该校验包的示例。

image

Feedback

# re: 使用InputVerifier设计Swing校验包  回复  更多评论   

2008-10-31 17:11 by hb148
东西不错,我按你的想法,弄了弄,不成,能给发个包吗?hb148@sina.com
谢谢了!

只有注册用户登录后才能发表评论。


网站导航: