我对使用Swing组件时绑定属性的使用有疑问。 所以,我有这个非常简单的Java类扩展JButton类:
public class MyBean extends JButton
{
public static final String PROP_SAMPLE_PROPERTY = "sampleProperty";
private String sampleProperty;
public MyBean() {
addPropertyChangeListener(new java.beans.PropertyChangeListener()
{
@Override
public void propertyChange(java.beans.PropertyChangeEvent evt) {
componentPropertyChange(evt);
}
});
}
public String getSampleProperty() {
return sampleProperty;
}
public void setSampleProperty(String value) {
String oldValue = sampleProperty;
sampleProperty = value;
firePropertyChange(PROP_SAMPLE_PROPERTY, oldValue, sampleProperty);
}
// Handle a property being updated
static private void componentPropertyChange(java.beans.PropertyChangeEvent evt) {
String propertyName = evt.getPropertyName();
System.out.println(MyBean.class.getSimpleName() + " - '" + propertyName + "' changed");
}
}
这是我的主要课程:
public static void main(String[] args) {
try
{
Class<?> clazz = MyBean.class;
BeanInfo bi = Introspector.getBeanInfo(clazz);
PropertyDescriptor[] pds = bi.getPropertyDescriptors();
for (PropertyDescriptor pd : pds)
{
System.out.println(String.format("%s - %s - %s", clazz.getSimpleName(), pd.getName(), Boolean.toString(pd.isBound())));
}
MyBean myBean = new MyBean();
myBean.setText("My name");
myBean.setLocation(new Point(10,10));
myBean.setVisible(true);
}
catch (IntrospectionException e)
{
e.printStackTrace();
}
}
运行此应用程序将输出:
MyBean - UI - true
MyBean - UIClassID - true
MyBean - accessibleContext - true
MyBean - action - true
...
MyBean - vetoableChangeListeners - true
MyBean - visible - true
MyBean - visibleRect - true
MyBean - width - true
MyBean - x - true
MyBean - y - true
**MyBean - 'text' changed**
我的问题:
对于所有MyBean属性,打印一行,告诉我属性已绑定,但是,当我创建一个MyBean实例并调用setText,setLocation和setVisible时,仅在setText的情况下打印一行。我的结论是(可能是错误的)如果调用setLocation和setVisible,则不会调用 firePropertyChange 方法,因此不会调用 PropertyChangedListener 。现在,我认为每次绑定属性更新时都会调用 firePropertyChange 方法?显然情况并非如此,或者印刷清单可能不对。对此的任何解释都将非常感激。
答案 0 :(得分:1)
我从来没有看到它记录(或在源代码中发现)所有set *方法都会导致一个PropertyChangeEvent,让我知道你有没有。通常,如果要捕获对方法的调用,则需要覆盖它。如果你这样做,不要忘记使用'super'关键字从被覆盖的方法中调用超类型的版本。
您可以在所述重写方法中调用firePropertyChanged。
在Swing代码之外,您可能会提供一个包装器实现,但这不适用于Swing,因为它使用的是具体类型而不是接口。