qiyadeng

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

          使用InputVerifier設計Swing校驗包

          Posted on 2008-07-27 10:43 qiyadeng 閱讀(2099) 評論(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
          謝謝了!

          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 合肥市| 屏南县| 天津市| 龙陵县| 兴海县| 隆昌县| 凤城市| 洪湖市| 同心县| 乐陵市| 新化县| 上林县| 和政县| 中超| 休宁县| 锡林浩特市| 隆尧县| 乌拉特前旗| 常宁市| 陆川县| 仪征市| 多伦县| 彩票| 钟山县| 隆化县| 延安市| 鹤壁市| 沂源县| 崇礼县| 白玉县| 泰顺县| 镇远县| 法库县| 翁源县| 克山县| 衡南县| 贵州省| 大关县| 普定县| 紫阳县| 嵩明县|