榪欐鏃墮棿鐪熸槸蹇欏緱瑕佹錛屼竴鏂歸潰瑕佸紑鍙戝叕鍙擱」鐩殑緋葷粺妗嗘灦錛岃灝嗛」鐩垎鎴愪笉鍚岀殑瀛愰」鐩紝緙栧啓鏍稿績浠g爜錛涘彟涓鏂歸潰瑕佸皢鏋侀檺緙栫▼錛圶P錛夊紩鍏ュ洟闃熷紑鍙戯紝閮ㄧ講鍚勭被
XP闇瑕佺殑鏈嶅姟渚嬪subversion鍟︼紝ant+ivy鍟︼紝Hudson鍟︾瓑絳夈傞『渚胯鍙ラ澶栬瘽錛寀buntu榪樼湡鏄笉鏄竴鑸殑濂界敤錛屽緩璁湁鑳藉姏鐨勫叏
閮ㄨ漿鍒皍buntu涓婂幓寮鍙戙?
鎴戠洰鍓嶅紑鍙戠殑榪欎釜妗嗘灦鐨勫鎴風鏄叿鑲ョ殑瀹㈡埛绔紝涔熷氨鏄疭wing瀹㈡埛绔簡銆係wing搴旂敤鐩稿浜嶹eb搴旂敤鏈夊緢澶氫紭鍔匡紝鍥犱負瀹冩洿鑲ャ傛暟鎹獙璇佸氨鏄?
鍏朵腑涓涓傚綋鐒剁幇鍦ㄧ殑Web搴旂敤閫氳繃浣跨敤Ajax涔熻姣斾互鍓嶅己寰堝浜嗭紝浣嗘槸榪樻槸閬垮厤涓嶄簡鍦ㄩ獙璇佹暟鎹椂鍚戞湇鍔℃鍙戝嚭璇鋒眰錛岃嚦灝戜綘鏃犳硶閬垮厤楠岃瘉緇撴灉浠嶹eb鏈?
鍔″櫒浼犺緭鍒扮敤鎴鋒祻瑙堝櫒涓婅繖孌佃繃紼嬨傝孲wing榪欑被鑲ュ鎴風鍙互瀹炵幇瀹屽叏鍦ㄦ湰鍦板鏁版嵁榪涜楠岃瘉錛岀敋鑷沖彲浠ユ柇緗戠戶緇伐浣滐紙榪欎篃鏄疻eb搴旂敤鐩墠鍦ㄧ爺鍙戠殑涓涓?
閲嶈璇鵑錛夈?
鍓嶆鏃墮棿寮鍙戝嚭浜嗕竴涓彲浠ュ簲鐢ㄤ簬鎵鏈塖wing搴旂敤鐨勯氱敤鏁版嵁楠岃瘉妯″潡錛屽彂鐜板畠鍦ㄩ」鐩腑浣跨敤鍚庯紝瀵逛簬鏅氱殑鏁版嵁楠岃瘉,紼嬪簭鍛樺嚑涔庝笉闇瑕佺紪鐮侊紝鏁堢巼鎻愰珮浜嗕笉灝戯紝灝卞啓浜嗕竴綃囧崥鏂囨嬁鍑烘潵鍜屽ぇ瀹跺垎浜傚師鏂囨槸鐢ㄨ嫳鏂囧啓鐨勶紝鍦ㄨ繖閲岋細http://polygoncell.blogspot.com/2008/07/validation-module-for-swing-application.html銆傝嫳鏂囧ソ鐨勬湅鍙嬪彲浠ョ洿鎺ュ幓閭i噷鐪嬨?
緙栧啓榪欎釜妯″潡浣跨敤浜嗗緢澶氫笉鍚岀殑寮婧愭鏋跺拰綾誨簱錛屽叾涓緢閲嶈鐨勪竴涓氨鏄疛XLayer銆傛枃绔犲啓瀹屽悗錛屾垜灝辮窇鍘婚個璇稪XLayer鐨勪綔鑰匒lexp鏉ユ寚鐐逛竴涓嬶紝鐒跺悗灝卞湪鎴戠殑鏂囩珷鍚庨潰寮濮嬩簡涓孌佃璁猴紝鎸烘湁鎰忔濈殑錛屼粬涓嶆劎涓烘槸Swing team閲岄潰鐨勭墰浜哄晩錛佸帀瀹沖晩錛佸懙鍛點?
ok錛屽洖鍒頒粖澶╄繖綃囨枃绔犵殑姝i銆備粖澶╃殑涓昏鐩殑鏄皢鎴戠殑鑻辨枃鍗氭枃緲昏瘧鎴愪腑鏂囷紙鑷繁鐨勬枃绔狅紝鎴戝氨涓嶉愬瓧閫愬彞緲昏瘧浜嗭紝鎰忔濆埌浜嗗氨琛屼簡錛屽彲鑳借繕浼氶殢鍏村睍
寮涓鐣璁猴級鍦ㄨ繖閲屽睍紺虹粰澶у錛屼笌澶у鍒嗕韓寮鍙戠粡楠岋紝甯屾湜澶у鑳藉浠庝腑鑾風泭錛屼篃甯屾湜鑳藉浠ユ枃浼氬弸錛屽箍浜ゆ湅鍙嬨傚簾璇濆皯璇達紝鍒囧叆姝i銆?
鏁版嵁楠岃瘉錛圴alidation錛変竴鐩存槸杞歡寮鍙戜腑闈炲父閲嶈鐨勪竴鐜紝鏈変簡瀹冿紝浣犵殑緋葷粺浼氳瀹㈡埛鎰熷埌鏇村姞鍙嬪杽錛屽悓鏃朵綘鐨勭郴緇熶篃寰楀埌浜嗕竴瀹氱▼搴︾殑淇?
鎶ゃ備竴鑸潵璇達紝鏁版嵁楠岃瘉鏃㈠彲浠ュ湪瀹㈡埛绔篃鍙互鍦ㄦ湇鍔$銆傞粯璁ょ殑JSF鏁版嵁楠岃瘉灝辨槸鍦ㄦ湇鍔$錛屾暟鎹彧鑳藉湪琚彁浜や互鍚庢墠鑳藉琚獙璇侊紝鐒跺悗鎶婇敊璇俊鎭紶閫掑洖鐢ㄦ埛
鐨勬祻瑙堝櫒銆傚悗鏉ュぇ瑙勬ā浣跨敤Ajax鍚庯紝鍩烘湰鍙互瀹炵幇瀵逛慨鏀圭殑鏁版嵁“鍗蟲椂”楠岃瘉錛屾敞鎰忚繖閲屾槸涓墦浜嗗紩鍙風殑鍗蟲椂錛屾暟鎹簨瀹炰笂榪樻槸瑕佸湪嫻忚鍣ㄥ拰鏈嶅姟绔箣闂磋繘琛屼紶
閫掔殑錛屽彧涓嶈繃Ajax灝嗚繖縐嶄紶閫掓敼涓洪殣寮忎簡鑰屽凡錛岀悊璁轟笂騫舵病鏈夌湡姝e疄鐜幫紙鏂綉錛夊嵆鏃墮獙璇併傝屽湪Swing搴旂敤涓婂氨鑳藉杈炬垚榪欑鎰挎湜銆?
浜嬪疄涓婏紝寮鍙慡wing搴旂敤鏃訛紝鏁版嵁楠岃瘉涓鐩存瘮杈冩鎵嬶紝闇瑕佹墜宸ョ紪鐮佺殑鍦版柟澶錛屾晥鐜囦笉楂樸傚悗鏉ュ嚭浜咼Goodies Validation
緇撳悎JGoodies binding鍚庯紝濂戒簡涓浜涖傝繖涓狫Goodies
Validation鏃㈠彲浠ュ疄鐜癿odel灞傞潰鐨勯獙璇侊紝涔熷彲浠ュ疄鐜癇ean灞傞潰鐨勯獙璇侊紝浣嗘槸澶氬勾浣跨敤涓嬫潵錛屽彂鐜板叾瀹炲畠姣旇緝閫傜敤浜庝腑灝忛」鐩紝鑰屼笖瑕佺紪鍐欑殑浠?
鐮佸叾瀹炰竴鐐逛笉姣旇嚜宸辨墜鍔ㄧ紪鍐欑殑灝戙?
JGoodies嫻佽浜嗕竴孌墊椂闂村悗錛宻un寮濮嬫帹鍑鴻嚜宸辯殑bean緇戝畾鏂規錛歜eansbinding錛圝SR
295錛夛紝鎴戜釜浜烘劅瑙夎姣擩Goodies
binding濂界敤錛圝Goodies鐨勪綔鑰匥arsten涔熷湪涓撳緇勯噷錛岃繖涓漢鎴戜互鍓嶅拰浠栦竴璧峰叡浜嬭繃錛屾垜鐨刴sn
space閲岄潰榪樻湁璺熶粬鐨勫悎褰憋紝緇濆鏄疭wing鐣岀殑鐗涗漢錛夈傝繖涓猙eansbinding涔熸彁渚涙暟鎹獙璇侊紝浣嗘槸瀹冪殑榪欎釜鏁版嵁楠岃瘉鍙槸鍦╰arget琚敼
鍔ㄥ悗錛屾暟鎹鍚屾鍥瀞ource涔嬪墠鎵嶄細璧蜂綔鐢紝浣跨敤璧鋒潵灞闄愭ф瘮杈冨ぇ錛岃屼笖緙栫爜閲忎篃涓嶅皬銆?
鐢變簬鐩墠緇濆ぇ閮ㄥ垎欏圭洰鏄熀浜嶱OJO鐨勶紝Hibernate
validator宸茬粡鎻愪緵浜嗕竴涓緢濂界殑鏁版嵁楠岃瘉妗嗘灦錛屾垜浠畬鍏ㄦ病蹇呰鍐嶉噸澶嶅彂鏄庤疆瀛愶紝鎴戜滑搴旇鍔姏绔欏湪宸ㄤ漢鐨勮偐鑶涓婏紝榪欐牱鎴戜滑鎵嶈兘绔欏緱鏇撮珮錛岀湅寰楁洿榪溿?
浜庢槸鎴戣冭檻緇撳悎beansbinding鍜孒ibernate
Validator寮鍙戞暟鎹獙璇併傝繕鏈変竴涓噸瑕佺殑闂錛岄偅灝辨槸鏁版嵁閿欒鐨勬椂鍊欙紝闇瑕佸湪鐢ㄦ埛鐣岄潰涓婂睍紺虹浉搴旂殑淇℃伅錛屼緥濡侲rror
icon鍜岄敊璇彁紺猴紝榪欓儴鍒嗘垜鑰冭檻浣跨敤JXLayer銆?
浣犲彲浠ュ湪濡備笅閾炬帴涓壘鍒扮浉鍏蟲鏋剁殑鍏蜂綋淇℃伅錛?
1. Hibernate Validator錛?http://www.hibernate.org/hib_docs/validator/reference/en/html_single/
2. Beansbinding: https://beansbinding.dev.java.net/
3. JXlayer: http://weblogs.java.net/blog/alexfromsun/
闃呰榪欑瘒鏂囩珷錛屼笉闇瑕佷綘鐔熸倝榪欎簺綾誨簱錛屼笉榪囦簡瑙h繖浜涚被搴撹兘澶熷府鍔╀綘鏇村ソ鍦扮悊瑙h繖綃囨枃绔犮?
鎴戠殑榪欎釜閫氱敤妯″潡鏄弬鑰僇XLayer閲岄潰鐨勪竴涓猟emo綾籘extValidationDemo鐨勶紝榪欎釜JXlayer鏄敱Alexander Potochkin寮鍙戠殑錛屾垜寰堝枩嬈紝浣跨敤璧鋒潵寰堥『鎵嬶紝寮虹儓鎺ㄨ崘浣跨敤銆?
涓嬮潰寮濮嬩粙緇嶄唬鐮併傞鍏堟槸寤虹珛涓涓猨ava欏圭洰錛屽浜庤繖涓皬欏圭洰錛屾垜浣跨敤netbeans銆傝繖閲岃鍙ラ澶栬瘽錛屼腑鍨嬪拰澶у瀷鐨凷wing搴旂敤錛屽緩璁渶
濂借繕鏄笉瑕佷嬌鐢╪etbeans鐨凣UI
Builder錛屼竴鏂歸潰瀹冪敓鎴愮殑浠g爜瓚呯駭鐑傦紝鍙︿竴鏂歸潰寰堥毦嫻嬭瘯銆傜洰鍓嶅競闈笂鏈夊緢澶氬ソ鐢ㄧ殑layout鐨勬鏋訛紝渚嬪 JGoodies
form鍜孧igLayout錛屽紑鍙戞晥鐜囩粷瀵逛笉姣攏etbeans鐨凣UI builder宸紝浣犺繕涓嶉渶瑕侀潰瀵逛護浜哄ご鐤肩殑鏈哄櫒鎴愮殑浠g爜銆?
欏圭洰鍒涘緩濂藉悗錛屽姞鍏ョ被搴擄細
鐒跺悗鍐欎竴涓猵ersistence bean:
package de.jingge.domain;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import org.hibernate.validator.Length;
import org.hibernate.validator.NotEmpty;
@Entity
public class Country extends AbstractBean {
private static final long serialVersionUID = 5341382564159667599L;
public static final String PROPERTYNAME_NAME = "name";
public static final String PROPERTYNAME_CODE = "code";
private String name;
private String code;
private Long id;
public Country() {
}
public Country(String code, String name) {
super();
setCode(code);
setName(name);
}
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
@NotEmpty
public String getName() {
return name;
}
public void setName(String name) {
firePropertyChange(PROPERTYNAME_NAME, this.name, this.name = name);
}
@Length(min=2, max= 2, message="Code length must be 2")
@NotEmpty
public String getCode() {
return code;
}
public void setCode(String code) {
firePropertyChange(PROPERTYNAME_CODE, this.code, this.code = code);
}
}
榪欓噷鎴戜負浜嗗己璋冨彲浠ュ湪Swing瀹㈡埛绔洿鎺ヤ嬌鐢ㄥ拰楠岃瘉persistence bean錛屾晠鎰忓啓浜嗕竴涓猵ersistence bean錛屽疄闄呭簲鐢ㄤ腑錛岃繖涓被鍙渶瑕佹槸涓涓猵ojo灝辮浜嗐?
榪欎釜Country綾諱唬琛ㄤ竴涓浗瀹訛紝瀹冩湁涓や釜灞炴э紝code鍜宯ame錛屾垜緇欎粬浠垎鍒姞涓婁釜鍚勮嚜鐨勯獙璇侀檺鍒躲俢ode涓嶈兘涓虹┖錛屼笖蹇呴』姝eソ鏄袱涓?
瀛楃錛屼緥濡侰N錛孌E錛孶S銆俷ame涓嶈兘涓虹┖銆傝繖浜沘nnotaion鍧囧嚭鑷狧ibernate
Validator銆傞偅涓埗綾籄bstractBean鍑鴻嚜SwingX綾誨簱錛屾垜浠殑Country綾葷戶鎵夸簡瀹冧箣鍚庡氨鍙互鏀寔property
change event浜嗐?
ok, 涓嬮潰鍙互寮濮嬬紪鍐欒繖涓ā鍧楃殑鏍稿績浠g爜浜嗐傚墠闈㈣榪囷紝鎴戜細浣跨敤JXlayer銆備嬌鐢ㄥ畠鐨勫ソ澶勬槸錛氭墍鏈塉Xlayer鐨刾ainting
event閮戒細琚漿鍒癠I綾繪潵錛屾垜浠彧闇瑕佺紪鍐欎竴涓泦鎴怘ibernate
Validator鐨刄I綾誨氨鍙互浜嗭紝鎴戠О榪欎釜綾諱負HibernateValidationUI錛屼唬鐮佸涓嬶細
package de.jingge.view;
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JComponent;
import javax.swing.text.JTextComponent;
import org.hibernate.validator.ClassValidator;
import org.hibernate.validator.InvalidValue;
import org.jdesktop.beansbinding.ELProperty;
import org.jdesktop.beansbinding.PropertyStateEvent;
import org.jdesktop.beansbinding.PropertyStateListener;
import org.jdesktop.jxlayer.JXLayer;
import org.jdesktop.jxlayer.plaf.AbstractLayerUI;
/**
* Header:
* Description: A layerUI which will validate the referenced property value of
* the object each time when the paint(
) method is called.
* The value of the given object property will be observed.
* Note: This UI works only with {@link JXLayer}. Any change of the property
* will force repainting the UI. The work process looks like: property changed ->
* jxlayer will be repainted -> the paint(
) method of this UI will be called.
* The logic of validation will be handled by the Hibernate validator
* framework.
*
*/
public class HibernateValidationUI extends AbstractLayerUI<jTextComponent> {
private Object object;
private String propertyName;
private ClassValidator validator;
private ELProperty elProperty;
private PropertyStateListener propertyChangeHandler;
public HibernateValidationUI(Object obj, String propertyName) {
this.object = obj;
this.propertyName = propertyName;
propertyChangeHandler = new PropertyChangeHandler();
validator = new ClassValidator(obj.getClass());
elProperty = ELProperty.create("${" + propertyName + "}");
}
public void installUI(JComponent c) {
super.installUI(c);
elProperty.addPropertyStateListener(object, propertyChangeHandler);
}
public void uninstallUI(JComponent c) {
super.uninstallUI(c);
elProperty.removePropertyStateListener(object, propertyChangeHandler);
}
protected void paintLayer(Graphics2D g2, JXLayer<jTextComponent> l) {
super.paintLayer(g2, l);
InvalidValue[] validationMessages = validator.getInvalidValues(object,
propertyName);
if (validationMessages.length > 0) {
BufferedImage image = Java2DIconFactory.createErrorIcon();
g2.drawImage(image, l.getWidth() - image.getWidth() - 1,
l.getHeight() - 8, null);
l.getView().setToolTipText(validationMessages[0].getMessage());
return;
}
l.getView().setToolTipText(null);
}
boolean isValid() {
return validator.getInvalidValues(object, propertyName).length == 0;
}
class PropertyChangeHandler implements PropertyStateListener {
@Override
public void propertyStateChanged(PropertyStateEvent pse) {
setDirty(true);
}
}
}
榪欎釜HibernateValidationUI綾誨彧鏈変竴涓瀯寤哄櫒錛屽畠鎺ユ敹涓や釜鍙傛暟錛屼竴涓槸source object錛屼篃灝辨槸鎴戜滑瑕佷慨鏀圭殑閭d釜Bean綾葷殑瀹炰緥錛屽彟澶栦竴涓槸榪欎釜bean鐨勪竴涓睘鎬э紝榪欎釜HibernateValidationUI灝辮礋璐i獙璇佽繖涓睘鎬с?
鍦╥nstallUI()鏂規硶涓紝鎴戜滑鍚姩瀵瑰睘鎬у彉鍖栫殑瑙傚療綾伙紝鑰屽湪uninstallUI()鏂規硶閲岄潰錛屾垜浠渶瑕佸嵏杞借繖涓瀵熺被銆?
褰撶粰瀹氬璞$殑灞炴у煎彂鐢熷彉鍖栨椂錛孭ropertyChangeHandler鐨刾ropertyStateChanged錛堬級鏂規硶灝變細琚皟鐢紝榪?
涓姛鑳芥槸閫氳繃elProperty鍜孭ropertzChangeHandler鐩哥粨鍚堟潵瀹炵幇鐨勩傚湪propertyStateChangeed()鏂規硶
閲孶I綾葷殑鏂規硶setDirty()浼氳璋冪敤錛岃鏂規硶鐨勮皟鐢ㄤ細瀵艱嚧UI綾葷殑鐘舵佸彉鍖栵紝榪涜屽紩鍙?re)painting錛屼箣鍚庣粡榪囦竴緋誨垪鐨勬柟娉曡皟鐢ㄤ紶
閫掞紝paintLayer(Graphics2D g2, JXLayer<jTextComponent>
l)榪欎釜鏂規硶灝嗕細琚皟鐢紝榪欎釜鏂規硶瑕佸仛鐨勫氨鏄垜浠繖涓暟鎹獙璇佹ā鍧楃殑鏍稿績鍔熻兘錛?
1. 璋冪敤Hibernate Validator楠岃瘉璇ュ睘鎬с?
2. 濡傛灉鏁版嵁涓嶆紜紝鍒欏湪GUI涓婃樉紺轟竴涓猠rror icon錛屽茍涓斿皢閿欒淇℃伅浣滀負tooltip灞曠ず緇欑敤鎴楓?
鍦ㄧ浜岀偣閲岄潰浜х敓浜嗕竴涓棶棰橈紝璋㈣阿Alexp瀵規垜鐨勬寚鐐廣係wing
team閲岄潰鏈変竴浜涜瀹氾紝鍏朵腑涔嬩竴灝辨槸錛屽湪paint()鏂規硶閲岄潰鏈濂戒笉瑕佹敼鍙楥omponent鐨勭姸鎬侊紝鑰宻etTooltip()鏂規硶灝嗕細鏀瑰彉
component鐨勭姸鎬侊紝鍥犳闇瑕佸湪paint()鏂規硶涔嬪璋冪敤銆傛垜鐩墠浣跨敤涓嬫潵錛岃繕娌℃湁鍙戠幇浠涔堜弗閲嶇殑閿欒錛屽喅瀹氭殏鏃朵笉鏀逛簡錛屽洖澶存湁鏃墮棿鍦ㄥ皢榪欎釜浠g爜
緲繪柊涓涓嬨?
綾諱腑鐢ㄥ埌鐨凧ava2DIconFactory浠g爜濡備笅錛?
package de.jingge.view;
import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
public class Java2DIconFactory {
public static BufferedImage createErrorIcon() {
return createErrorIcon(7, 8);
}
public static BufferedImage createErrorIcon(int width, int height) {
BufferedImage icon = new BufferedImage(width, height,
BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = (Graphics2D) icon.getGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2.setRenderingHint(RenderingHints.KEY_STROKE_CONTROL,
RenderingHints.VALUE_STROKE_PURE);
g2.setColor(Color.RED);
g2.fillRect(0, 0, width, height);
g2.setColor(Color.WHITE);
g2.drawLine(0, 0, width, height);
g2.drawLine(0, height, width, 0);
g2.dispose();
return icon;
}
}
娌′粈涔堝お澶氬ソ瑙i噴鐨勶紝灝辨槸浣跨敤Java 2D鐢諱竴涓狤rror icon銆?
鎺ョ潃錛屾垜浠渶瑕佺紪鍐欎竴涓狥actory綾伙紝鏋勫緩涓涓狫TextField錛屽敖閲忔妸澶嶆潅鎶鏈皝瑁呰搗鏉ワ紝榪欐牱紼嬪簭鍛樺紑鍙戣搗鏉ュ彲浠ユ彁楂樻晥鐜囷紝浠g爜濡備笅錛?
package de.jingge.view;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;
import org.jdesktop.beansbinding.AutoBinding;
import org.jdesktop.beansbinding.BeanProperty;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.beansbinding.Bindings;
import org.jdesktop.beansbinding.ELProperty;
import org.jdesktop.jxlayer.JXLayer;
import static org.jdesktop.beansbinding.AutoBinding.UpdateStrategy.*;
public class GuiComponentFactory {
public static JXLayer<jTextComponent> createTextField(
BindingGroup bindingGroup, Object sourceObject,
String sourceProperty) {
JTextField field = new JTextField();
AutoBinding binding = Bindings.createAutoBinding(READ_WRITE,
sourceObject, ELProperty.create("${" + sourceProperty + "}"),
field, BeanProperty.create("text"));
bindingGroup.addBinding(binding);
bindingGroup.bind();
return new JXLayer<jTextComponent>(field, new HibernateValidationUI(
sourceObject, sourceProperty));
}
}
createTextField()鏂規硶涓昏灝嗙粰瀹氬璞″睘鎬х殑鍊間笌JTextField鐨則ext緇戝畾錛岀劧鍚庡皢JTextField綰沖叆鍒?
JXLayer鐨勭鐞嗕箣涓嬨傝繖鏍蜂竴鏉ワ紝涓鏃︾敤鎴峰湪JTextField閲岄潰淇敼鏁版嵁錛岃繖涓敼鍙樺氨浼氬悓姝ュ埌璇ュ璞″睘鎬т笂錛岀劧鍚庡氨寮曞彂浜嗗墠闈㈡弿榪扮殑涓緋誨垪閫?
杈戯紝鏈緇堟敼鍙樼殑鏁版嵁灝變細琚獺iberante Validator鍔犱互楠岃瘉銆?
鏈鍚庯紝鎴戜滑鍙互緙栧啓涓涓狣emo application鏉ョ湅鐪嬫晥鏋滃浣曪紝浠g爜濡備笅錛?
package de.jingge.main;
import de.jingge.domain.Country;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Toolkit;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.JTextComponent;
import net.miginfocom.swing.MigLayout;
import org.jdesktop.beansbinding.BindingGroup;
import org.jdesktop.jxlayer.JXLayer;
import static de.jingge.view.GuiComponentFactory.*;
public class ValidationApplicaton {
private BindingGroup bg;
private Country country;
private JXLayer<jTextComponent> codeField;
private JXLayer<jTextComponent> nameField;
/**
* @param args the command line arguments
*/
public static void main(String[] args) {
try {
UIManager.setLookAndFeel(
"com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
} catch (UnsupportedLookAndFeelException ex) {
System.err.println(
"Nimbus L&F does not support. Default L&F will be used.");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
ValidationApplicaton app = new ValidationApplicaton();
JFrame frame = new JFrame("Demo Validation Application");
frame.setPreferredSize(new Dimension(360, 150));
frame.getContentPane().add(app.buildPanel(), BorderLayout.CENTER);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setCenter(frame);
frame.setVisible(true);
frame.pack();
}
private static void setCenter(JFrame frame) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
Dimension screenSize = toolkit.getScreenSize();
// Calculate the frame location
int x = (screenSize.width - (int) frame.getPreferredSize().getWidth()) / 2;
int y = (screenSize.height - (int) frame.getPreferredSize().getHeight()) / 2;
// Set the new frame location
frame.setLocation(x, y);
}
public ValidationApplicaton() {
country = new Country();
bg = new BindingGroup();
}
private JPanel buildPanel() {
codeField = createTextField(bg, country, Country.PROPERTYNAME_CODE);
nameField = createTextField(bg, country, Country.PROPERTYNAME_NAME);
JPanel panel = new JPanel(new MigLayout("",
"[50px, right]10[200px:250px:300px]", "[center]"));
panel.add(new JLabel("Code:"), "cell 0 0");
panel.add(codeField, "cell 1 0, w 200px:250px:300px");
panel.add(new JLabel("Name:"), "cell 0 1");
panel.add(nameField, "cell 1 1, w 200px:250px:300px");
return panel;
}
}
榪欎釜綾繪瘮杈冪畝鍗曚簡錛屾垜綆鍗曡В閲婁竴涓嬶細
鍦╩ain()鏂規硶閲岄潰錛屾垜浠垱寤轟簡涓涓狫Frame錛岀劧鍚庢斁鍏ヤ竴涓狫Panel
setCenter()鏂規硶璐熻矗灝嗙獥鍙h嚦浜庡睆騫曠殑姝d腑闂淬?
鍦ㄦ瀯寤哄櫒閲岄潰錛屾垜浠垱寤轟簡Country鍜孊indingGroup鐨勫璞″疄渚嬨?
鍦╞uildPanel()鏂規硶閲岄潰錛屾垜浠嬌鐢∕igLayout鏋勫緩浜嗕竴涓狿anel錛屽叾涓璫odeField鍜宯ameField瀵瑰簲鍚勮嚜鐨勫璞″睘鎬с傛洿澶氬叧浜嶮igLayout鐨勪俊鎭湅榪欓噷錛?a target="_blank">http://www.miglayout.com/銆傝繖涔熸槸涓涓緥瀛愶紝澶у鍙互鐪嬪埌浣跨敤MigLayout寮鍙慡wing鐪熺殑鏄潪甯告柟渚褲?
浠庤繖涓狣emo閲岄潰涔熷彲浠ョ湅鍑猴紝緙栧啓濂絧ojo鍚庯紝紼嬪簭鍛樺彧闇瑕佽皟鐢╟reateTextField(bg, country,
Country.PROPERTYNAME_CODE); 灝卞彲浠ュ垱寤轟竴涓敮鎸佹暟鎹獙璇佺殑JTextField錛岀紪鐮侀噺宸茬粡鍙互璇存槸鏈澶ч檺搴︾殑闄嶄綆浜嗐?
榪愯紼嬪簭錛屼綘浼氱湅鍒幫細
榪欎釜code鍜宯ame鐨勬暟鎹兘涓嶅悎娉曪紝鐢ㄦ埛鐪嬪埌浜唀rror icon銆?
灝嗛紶鏍囩Щ鍒癟ext field涓婏紝浣犱細鐪嬪埌錛?
濉ソ鍚堟硶鏁版嵁鍚庯紝Error icon灝變笉瑙佷簡錛?
鎬葷粨錛?
浣跨敤榪欎釜閫氱敤鏁版嵁楠岃瘉妯″潡鏈夊緢澶氬ソ澶勶細
1. 濡傛灉欏圭洰浣跨敤ORM錛屼緥濡侶ibernate錛岃繖涓柟妗堝簲璇ユ槸瑙e喅鏁版嵁楠岃瘉鐨勬渶濂芥柟妗堜箣涓銆?
2. 瀵逛簬鏅氱殑鏁版嵁楠岃瘉錛屼緥濡傞潪絀猴紝email錛岄暱搴︾瓑絳夛紝紼嬪簭鍛樻牴鏈笉闇瑕佺紪鐮侊紝鍙鍦≒OJO涓婁嬌鐢ㄧ浉搴旂殑Hibernate Validator annotation灝卞彲浠ヤ簡銆?
3. 瀵逛簬澶嶆潅鐨勬暟鎹獙璇侊紝Hibernate Validator鎻愪緵浜嗗緢濂界殑鎵╁睍鏈哄埗錛屽彧瑕佸啓涓涓猘nnotation澶栧姞涓涓猇alidator灝卞彲浠ヤ簡銆係wing搴旂敤榪欒竟浠嶇劧涓嶉渶瑕佺紪鍐欎換浣曚唬鐮併?
緇間笂鎵榪幫紝鍙互鐪嬪嚭閫氳繃浣跨敤榪欎釜閫氱敤鏁版嵁楠岃瘉妯″潡錛屽紑鍙戞晥鐜囦細鎻愰珮寰堝銆?

]]>