使用InputVerifier設(shè)計(jì)Swing校驗(yàn)包
盡管有許多針對Swing的校驗(yàn)框架,并且Swing中也有API InputVerifier用于數(shù)據(jù)校驗(yàn),InputVerifier易于使用并且容易定制。本文將在InputVerifier的基礎(chǔ)上構(gòu)建一個(gè)可用的校驗(yàn)包,可以在其它的Swing應(yīng)用之中。
InputVerifier類在javax.swing包中。它有一個(gè)抽象方法,我們需要實(shí)現(xiàn)一個(gè)叫verify()的方法,這個(gè)方法接受一個(gè)JComponent作為參數(shù),返回值為true或false。一旦我們實(shí)現(xiàn)了verify()方法,我們可以在JTextField中使用如下:
JTextField text = new JTextField();
Text.setInputVerifier(new MyVerifier());
然而,InputVerifier本身并沒有什么意思。它的作用是防止用戶輸入錯(cuò)誤的信息在組件中,阻止用戶把輸入光標(biāo)移動(dòng)到其他組件上。這種方式令人感到厭煩并且用戶不知道錯(cuò)誤所在。InputVerifier并沒有提供一些更好的功能,所以我們需要構(gòu)建一個(gè)如下校驗(yàn)包:
1. 如果數(shù)據(jù)不正確時(shí),可以改變輸入組件的背景顏色。
2. 如果數(shù)據(jù)不正確時(shí),可以彈出消息提示用戶錯(cuò)誤出在什么地方,應(yīng)該怎么處理。
3. 我們需要通知Form窗體每個(gè)組件的校驗(yàn)結(jié)果,這樣的話Form窗體可以執(zhí)行相應(yīng)的動(dòng)作。(例如啟動(dòng)”O(jiān)K”按鈕)
4. 如果用戶改正了組件的錯(cuò)誤數(shù)據(jù),則錯(cuò)誤提示信息應(yīng)消失。
我們的包中包含一個(gè)抽象類,這個(gè)抽象類處理了大部分的工作,我們只需要實(shí)現(xiàn)一個(gè)方法,決定使用什么規(guī)則來進(jìn)行數(shù)據(jù)校驗(yàn);同時(shí)也提供一個(gè)接口,如果需要校驗(yàn)的Form窗體需要校驗(yàn)結(jié)果通知Form窗體,則可以實(shí)現(xiàn)該接口。好了,我們現(xiàn)在可以設(shè)計(jì)這個(gè)接口。
WantsValidationStatus接口
下面的接口可以提供一種方式用于出發(fā)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.
}
實(shí)現(xiàn)這個(gè)接口可以通知Form窗體校驗(yàn)狀態(tài),但是實(shí)現(xiàn)該接口不是必須的。我們也可以不是實(shí)現(xiàn)這個(gè)接口,如果校驗(yàn)失敗不做任何事情。但是,我認(rèn)為這樣的設(shè)計(jì)是比較優(yōu)美的。接下來看看我們的抽象類。
AbstractValidator類
AbstarctValidator處理了顯示出錯(cuò)提示,改變出錯(cuò)背景,通知Form窗體等許多工作。只留下一個(gè)抽象的方法待實(shí)現(xiàn),protected abstract Boolean validateCriteria(JComponent c),這個(gè)方法我們需要提供自己的校驗(yàn)規(guī)則用于校驗(yàn)組件。以下是抽象類:
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()方法
當(dāng)需要校驗(yàn)是調(diào)用方法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;
}
}
調(diào)用方法如下:
ToolTipsEmptyValidator validator1 = new ToolTipsEmptyValidator(jDialog,localdbPanel.getIpAddressField(),"Error,IP Address can't be empty");
boolean flag1 = validator1.verify(localdbPanel.getIpAddressField());
下圖是使用該校驗(yàn)包的示例。
