【问题标题】:Java Subclass property bound or not?Java子类属性绑定与否?
【发布时间】:2012-10-11 11:56:00
【问题描述】:

我有一个关于在使用 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 方法会在更新时为每个绑定属性调用?显然情况并非如此,或者打印的列表可能是错误的。对此的任何解释将不胜感激。

【问题讨论】:

  • 作为记录(多年后),没有“可见”或“位置”绑定属性,因此没有事件被触发。 Swing 将 getFoo() 和 setFoo() 用于大多数绑定属性,但不是全部,并且有 set/get 调用,而这些调用又不是属性。

标签: java swing properties


【解决方案1】:

我从未见过它记录(或在源代码中发现)所有 set* 方法都会导致 PropertyChangeEvent,如果你有以及在哪里,请告诉我。通常,如果您想捕获对方法的调用,则需要覆盖它。如果您这样做,请不要忘记从被覆盖的方法中调用超类型的版本,使用 'super' 关键字。

您可以从所述被覆盖的方法中调用 firePropertyChanged。

在 Swing 代码之外,您可能会提供一个包装器实现,但这不适用于 Swing,因为它使用具体类型而不是接口。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 2013-12-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-10
  • 1970-01-01
  • 2011-08-23
相关资源
最近更新 更多