2012-03-28 21 views
11

Tengo una aplicación con varias ventanas/vistas que muestran el mismo objeto. Por ejemplo, tengo un objeto de usuario con cadenas de nombre y ubicación y un ImageIcon para su imagen.Enlace de datos con Java

Luego, en mis ventanas que utilizará los detalles de ese objeto de usuario como esto -

  1. creo un JPanel.
  2. agrego JLabels a ella (nameLabel, locationLabel, imageLabel)
  3. llamo setText() (o setIcon para imageLabel) para cada una de estas etiquetas para establecer su texto/imagen a los datos de objetos de usuario.

tengo que repetidamente hacemos esto para

  1. cada ventana donde se muestra los datos del objeto de usuario
  2. cada vez que el objeto de usuario se cambia tengo que llamar setText() en las etiquetas de nuevo.

En C# cuando estaba usando databinding, cuando actualicé un objeto se reflejó automáticamente en el elemento de la GUI que estaba enlazado a él. ¿Algo similar existe con Java?

+0

favor y su pregunta (s) es/son aproximadamente ???, por favor enviar un [SSCCE] (http://sscce.org/) Demostrando su (s) problema (s) con Vinculaciones/Enlace de datos – mKorbel

+3

Presenté exactamente lo que estoy haciendo en la lista anterior. No todas las preguntas requieren un SSCCE particularmente uno como este, que no pregunta sobre un problema de código. Me pregunto si la vinculación de datos es posible con Java porque en C# es la forma estándar de hacer la GUI. No encontré ninguna información de enlace de datos java endorsed oficial en google y los resultados de google de la primera página que obtengo para 'Java databinding' contienen cosas como 'java databinding api no listo para el horario estelar' y 'Beans Binding: una solución Java Data-Binding con un problema grave ' –

+1

bien entonces sus respuestas podrían ser fuelles o JSR296 – mKorbel

Respuesta

3

patrón MVP le ayuda a lograr esto. Tienes que escribir criar eventos personalizados y adjuntar oyentes de interfaz de usuario para responder a estos eventos (patrón de observador). Java proporciona PropertyChangeEvents y PropertyChangeListeners además de los contratos Observer y Observable.

3

Hay un ejemplo en el artículo Java SE Application Design de enlace de datos.

Ver el AbstractModel que utiliza PropertyChangeSupport.

Las clases que deben notar que el objeto ha cambiado implementarán PropertyChangeListener (vea AbstractController).

1

He estado codificando con java y C# durante mucho tiempo y He codificado mis propios PropertyChangeListeners en Java al imitar .net y aquí debajo de mi método.

Para la serialización de este objeto codifiqué filtros especiales contra el serializador, es decir. XStream, serialización de objetos nativos java

Si necesita DIY puede usar mi camino o también puede progresar yendo a través de la infraestructura de Oracle como @Pau Kiat Wee lo vinculó en su respuesta.

echar un vistazo JGoodies para los datos de oscilación de unión para más ya construido en la materia http://www.jgoodies.com/download/presentations/binding.pdf http://www.jgoodies.com/downloads/demos/

Aquí está mi aplicación,

Su objeto de negocio se extenderá de esta clase abstracta.

Claro, si ya se está extendiendo desde otra cosa y esto no es uno de los suyos esta opción es increíblemente útil para usted.

más posiblemente usted no tiene intención de serializar propertyChangeListeners solicitantes de registro y enviar algunos datos a alguna parte con él (un servicio remoto que no sabe la clase de interfaz de usuario dependiente y esto va a ser dolor de cabeza) .Así, estamos salteando serialización por esta manera.

Tenga en cuenta private void writeObject(java.io.ObjectOutputStream out) y private void readObject(java.io.ObjectInputStream in) firmas. Intencionalmente los dejé vacíos y estas significativas firmas de métodos están consideradas por Java Object Serialization.

Esta es nuestra interfaz imitada PropertyChangeEvent, utilizaremos el patrón de observador para notificar a nuestros registrantes.

public interface IPropertyChangedListener extends EventListener { 

    public void onPropertyChanged(Object source,String propertyName,Object oldValue,Object newValue); 

} 

Esta es nuestra base de 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 { 


       } 

} 

Ahora, vamos a usarlo

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 !!! 

       } 
      }); 

Esto es lo que hay que hacer en su 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); 
    } 

} 

Si no quieres hacer mi voluntad, o puedes ' t por alguna razón. Deberías seguir a JGoodies, este parece ser el mejor de todos. En demostraciones, descargue el archivo JNLP y usted verá parte de DataBinding. Hay una sección de código cuando haces clic en una flecha que se encuentra en la parte superior derecha. ¡Buena suerte! http://www.jgoodies.com/downloads/demos/

0

Uso de archivos en lugar de betterbeansbinding.jar beansbinding.jar

Cuestiones relacionadas