使用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());
下圖是使用該校驗包的示例。
