【问题标题】:Data binding with Java使用 Java 进行数据绑定
【发布时间】:2012-04-12 01:30:18
【问题描述】:

我有一个应用程序,其中包含多个显示相同对象的窗口/视图。例如,我有一个用户对象,其中包含名称和位置字符串以及他们的图片的 ImageIcon。

然后在我的窗口上,我将像这样使用该用户对象的详细信息 -

  1. 我创建了一个 JPanel。
  2. 我在其中添加了 JLabel(nameLabel、locationLabel、imageLabel)
  3. 我为每个标签调用 setText()(或 setIcon for imageLabel)将它们的文本/图像设置为用户对象数据。

我必须反复这样做

  1. 显示用户对象数据的每个窗口
  2. 每次更改用户对象时,我都必须再次在标签上调用 setText()。

在 C# 中,当我使用数据绑定时,所以当我更新一个对象时,它会自动反映在数据绑定到它的 GUI 元素中。 Java是否存在类似的东西?

【问题讨论】:

  • 请您的问题是/是关于???,请发布SSCCE 展示您的绑定/数据绑定问题
  • 我在上面的列表中准确地列出了我在做什么。并非每个问题都需要 SSCCE,尤其是这样的问题,它不询问代码问题。我在问是否可以使用 java 进行数据绑定,因为在 C# 中,这是进行 GUI 工作的标准方式。我没有在 google 上找到任何官方 sun 认可的 java 数据绑定信息,而且我获得的“Java 数据绑定”的第一页 google 结果包含诸如“java 数据绑定 api 尚未准备好迎接黄金时段”和“Beans Binding:Java 数据绑定解决方案”之类的内容有一个严重的问题'
  • 那么你的答案可能是波纹管或 JSR296

标签: java swing data-binding


【解决方案1】:

使用更好的beansbinding.jar 文件而不是beansbinding.jar

【讨论】:

    【解决方案2】:

    我已经用 java 和 c# 编码很长时间了 我通过模仿 .net 和我的方法在 Java 中编写了我自己的 propertyChangeListeners。

    为了对这个对象进行序列化,我编写了针对序列化程序的特殊过滤器,即XStream , java 原生对象序列化

    如果您需要 DIY,您可以使用我的方式,或者您也可以通过 Oracle 的基础架构取得进展,因为@Pau Kiat Wee 在他/她的回答中将其链接。

    查看 JGoodies for Swing 数据绑定以了解更多已内置的东西http://www.jgoodies.com/download/presentations/binding.pdf http://www.jgoodies.com/downloads/demos/

    这是我的实现,

    您的业务对象将从这个抽象类扩展。

    当然,如果您已经从其他东西扩展,而这不是 您的其中一个选项不可能为您工作。

    您很可能无意序列化propertyChangeListeners 注册者并将一些数据发送到某个地方(远程服务不知道您的 UI 依赖类,这会让人头疼)。所以,我们跳过序列化这边。

    请注意private void writeObject(java.io.ObjectOutputStream out)private void readObject(java.io.ObjectInputStream in) 签名。我故意让它们空着,而这些意义重大 方法签名由Java Object Serialization 考虑。

    这是我们的PropertyChangeEvent模拟接口,我们将使用观察者模式来通知我们的注册者。

    public interface IPropertyChangedListener extends EventListener {
    
        public void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue);
    
    }
    

    这是我们的 DataBusinessObject 基础

    public abstract class DataObjectBase implements Serializable {
    
    
        private List<IPropertyChangedListener> propertyChangeListeners=new ArrayList<IPropertyChangedListener>();   
        public void addOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener)
        {   
            ensureRegisterListCreated();
            propertyChangeListeners.add(propertyChangeListener);
        }
    
        public void removeOnPropertyChangedListener(IPropertyChangedListener propertyChangeListener)
        {
            ensureRegisterListCreated();
            propertyChangeListeners.remove(propertyChangeListener);
        }
    
        public DataObjectBase()
        {
            ensureRegisterListCreated();
        }
    
        public void ensureRegisterListCreated()
        {
            if(propertyChangeListeners==null)
                propertyChangeListeners=new ArrayList<IPropertyChangedListener>();      
        }
    
        protected void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue)
        {
            if(propertyChangeListeners.size()<=0)
                return;
            for (IPropertyChangedListener listener : propertyChangeListeners) {
                listener.onPropertyChanged(source, propertyName, oldValue, newValue);
            }
        }
    
        private void writeObject(java.io.ObjectOutputStream out)
                 throws IOException
                 {
    
                 }
    
         private void readObject(java.io.ObjectInputStream in)
                  throws IOException {
    
    
                  }
    
    }
    

    现在,让我们使用它

    dataObject.addOnPropertyChangedListener(new IPropertyChangedListener() {
    
                    @Override
                    public void onPropertyChanged(Object source, String propertyName,
                            Object oldValue, Object newValue) {
                        System.out.println(String.format("%s %s %s",propertyName,oldValue,newValue));
    //TODO:Fire your UI change now !!!
    
                    }
                });
    

    这是您需要在 dataObject 中执行的操作

    public class dataObject extends BaseDataObject
    {
    
        private String editable;
    
        public String getEditable() {
           return editable;
        }
    
        public void setEditable(String isEditable) {
            String oldValue=this.editable;      
            this.editable = isEditable;
            onPropertyChanged(this,"Editable",oldValue,isEditable);
        }
    
    }
    

    如果你不想按照我的方式行事,或者由于某种原因你不能。你应该关注 JGoodies,这似乎是最好的之一。 在演示中下载 JNLP 文件,您将看到 DataBinding 部分。当您单击位于右上角的箭头时,会出现代码部分。祝你好运! http://www.jgoodies.com/downloads/demos/

    【讨论】:

      【解决方案3】:

      Java SE Application Design 数据绑定文章中有一个示例。

      查看使用PropertyChangeSupportAbstractModel

      需要注意对象已更改的类将实现PropertyChangeListener(参见AbstractController)。

      【讨论】:

        【解决方案4】:

        MVP 模式可帮助您实现这一目标。您必须编写引发自定义事件并附加 UI 侦听器以响应这些事件(观察者模式)。除了 Observer 和 Observable 合约之外,Java 还提供了 PropertyChangeEvents 和 PropertyChangeListeners。

        【讨论】:

          【解决方案5】:

          你需要的是Property Change Listener

          【讨论】:

            猜你喜欢
            • 2011-01-19
            • 2012-04-26
            • 2010-12-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-03-21
            相关资源
            最近更新 更多