,另外一个是这个bean的一个属性,这个HibernateValidationUI就负责验 证这个属性。
在installUI()方法中,我们启动对属性变化的观察类,而在uninstallUI()方法里面,我们需要卸载 这个观察类。
当给定对象的属性值发生变化时,PropertyChangeHandler的propertyStateChanged()方法就会被调 用,这个功能是通过elProperty和PropertzChangeHandler相结合来实现的。在propertyStateChangeed() 方法里UI类的方法setDirty()会被调用,该方法的调用会导致UI类的状态变化,进而引发(re)painting, 之后经过一系列的方法调用传递,paintLayer(Graphics2D g2, JXLayer<jTextComponent> l)这个 方法将会被调用,这个方法要做的就是我们这个数据验证模块的核心功能:
1. 调用Hibernate Validator验证该属性。
2. 如果数据不正确,则在GUI上显示一个error icon,并且将错误信息作为tooltip展示给用户。
在第二点里面产生了一个问题,谢谢Alexp对我的指点。Swing team里面有一些规定,其中之一就是, 在paint()方法里面最好不要改变Component的状态,而setTooltip()方法将会改变 component的状态,因 此需要在paint()方法之外调用。我目前使用下来,还没有发现什么严重的错误,决定暂时不改了,回头 有时间在将这个代码翻新一下。
类中用到的Java2DIconFactory代码如下:
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;
}
}
Swing通用数据验证模块(5)
时间:2011-08-13 葛京
没什么太多好解释的,就是使用Java 2D画一个Error icon。
接着,我们需要编写一个Factory类,构建一个JTextField,尽量把复杂技术封装起来,这样程序员开 发起来可以提高效率,代码如下:
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, ELProper
|