锁定老帖子 主题:适用于各类Swing应用的通用数据验证模块
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2008-07-19
请注意:本文的版权归作者所有,如转载请注明出处。
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); } }
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); } } }
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; } }
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)); } }
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; } }
声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2008-07-19
有点像spring的RCP
|
|
返回顶楼 | |
发表时间:2008-07-21
呵呵,谢谢楼上两位捧场。
|
|
返回顶楼 | |
发表时间:2008-07-21
引用 我会考虑将整个netbeans项目上传到javaeye上来。 期待,希望楼主上传
|
|
返回顶楼 | |
发表时间:2008-07-21
大师级的人物Kirill Grouchnikov在他的swing links中加入了我关于通用验证模块英文博文的链接:
Alex himself continues writing about the JXLayer project and talks about the internal painting implementation in his latest entry. Jing Ge has a follow up entry in which he builds a complete validation module using BeansBinding, JXLayer and Hibernate Validator. 原文见这里: http://www.pushing-pixels.org/?p=373 |
|
返回顶楼 | |
发表时间:2008-07-21
看来这里还是老问题啊, 国内没人搞Swing应用, 现在在国外可是热点啊。
|
|
返回顶楼 | |
发表时间:2008-07-22
polygoncell 写道 看来这里还是老问题啊, 国内没人搞Swing应用, 现在在国外可是热点啊。
现在正在用swing做项目,楼主有没有什么好的资源介绍下啊 |
|
返回顶楼 | |
发表时间:2008-07-22
zstsr 写道 polygoncell 写道 看来这里还是老问题啊, 国内没人搞Swing应用, 现在在国外可是热点啊。
现在正在用swing做项目,楼主有没有什么好的资源介绍下啊 那要看你们项目的规模了,不同的规模使用不同的资源。 |
|
返回顶楼 | |
发表时间:2008-07-23
swing 确实长进了不少,感觉使用率明显提升了。。。。
|
|
返回顶楼 | |
发表时间:2008-07-23
java champions Adam Bien 曾经说过,搞java开发有一个很有趣的现象,那就是如果你一直坚持使用某种技术,例如java desktop, mvc等等,一般会存在几年低谷, 大家都认为这么做是错的。但是总会经过几年以后重新热起来,大家转了一大圈以后发现还是这样做最好。Desktop现在就又开始热起来了,新的Swing,Adobe AIR, JavaFX哪个不是瞄准桌面的?
|
|
返回顶楼 | |