【问题标题】:Java beans binding: adapters?Java bean 绑定:适配器?
【发布时间】:2010-04-14 16:46:04
【问题描述】:

这是一个非常简单的类:

static public class Bean1
{
    final private String name;
    final private Bean1 parent;
    private int favoriteNumber;

    public String getName() { return this.name; }
    public Bean getParent() { return this.parent; }
    public int getFavoriteNumber() { return this.favoriteNumber; }
    public void setFavoriteNumber(int i) { this.favoriteNumber = i; }
}

我想做的是将一些UI组件绑定到BeanAdapter<Bean1>(参见com.jgoodies.binding.beans.BeanAdapter),这样如果BeanAdapter指向Bean1 bean1,那么我可以显示

bean1.name           (blank if null)
bean1.parent.name    (blank if null or if bean1.parent is null)
bean1.favoriteNumber 

namefavoriteNumber 字段很简单,但我对如何显示父名称感到困惑。看起来 BeanAdapter 只允许我绑定到直接存在于 Bean1 中的属性。但这是较差的模块化,每次我想绑定到 bean 的新方面时,它都会迫使我添加 getter/setter 函数。

我想做的是编写一个帮助类,它知道如何访问一个 bean,但我很困惑如何让它与 Bean1 和 BeanAdapter 一起正常工作。

对不起,如果这个问题不是更清楚,我不知道词汇并且对绑定的概念有点模糊。

【问题讨论】:

    标签: java swing data-binding


    【解决方案1】:

    这里的问题是绑定在两种方式下都起作用:从 modelui,以及从 uimodel强>。

    在您的情况下,您将如何处理第一次在绑定到 parent.name 的文本字段中输入信息的人?您会即时创建父母吗?你会报错吗?

    如果您知道在这种情况下该怎么做(例如,使用该名称创建父级),您可以使用 com.jgoodies.binding.value.AbstractConverterBean1 转换为 String

    public class ParentNameConverter extends AbstractConverter {
    
        /**
         * Converts a value from the subject to the type or format used
         * by this converter.
         *
         * @param subjectValue  the subject's value
         * @return the converted value in the type or format used by this converter
         */
        public Object convertFromSubject(Object subjectValue) { ... }
    
    
        /**
         * Sets a new value on the subject, after converting to appropriate type 
         * or format
         *
         * @param newValue the ui component's value
         */
        public void setValue(Object newValue) { ... }
    }
    

    您可以像使用普通 ValueModel 一样使用此转换器:

        Bindings.bind(uifield,"value", 
                      new ParentNameConverter(beanAdapter.getValueModel("parent")));
    

    【讨论】:

    • 耶,这看起来像是我想做的。我一直很难理解绑定的基本概念。每次我认为我了解如何实现一项任务时,除非我能找到可以使用的基本工具(如本例中的 AbstractConverter),否则这似乎是不可能的,否则您必须自己编写所有 addPropertyChangeListener 的东西。
    • 如果您尝试使用绑定库而不是使用事件处理程序、侦听器等填充所有应用程序。您已经完成了一个出色的 Swing 应用程序! ;) 无论如何,我真的推荐这本书 - amazon.com/Desktop-Java-Live/dp/0974884332。虽然它是在 2005 年写成的,但它仍然胜过所有的摇摆书,而且它有一章解释了绑定库。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多