vistas vista mvc modelo ejemplo controlador java model-view-controller javafx model javabeans

vista - mvc mysql java



Envoltura JavaBean con propiedades JavaFX (1)

Las clases de Simple*Property son implementaciones completas e independientes de sus clases abstractas de Property correspondientes, y no dependen de ningún otro objeto. Por lo tanto, por ejemplo, SimpleStringProperty contiene un campo String (privado) que contiene el valor actual de la propiedad.

Los parámetros para el constructor que mostró:

new SimpleStringProperty(bean, "name")

son:

  • bean : el frijol al que pertenece la propiedad, si corresponde
  • name : el nombre de la propiedad

El bean puede ser útil en el ChangeListener changed(...) ChangeListener ya que puede recuperar el "bean propietario" de la propiedad que cambió desde la propiedad misma. El name se puede usar de manera similar (si tiene el mismo oyente registrado con múltiples propiedades, puede averiguar qué propiedad cambió: aunque nunca utilizo este patrón).

Entonces, el uso típico de SimpleStringProperty como propiedad observable de un objeto se ve así:

public class Person { private final StringProperty firstName = new SimpleStringProperty(this, "firstName"); public final String getFirstName() { return firstName.get(); } public final void setFirstName(String firstName) { this.firstName.set(firstName); } public StringProperty firstNameProperty() { return firstName ; } // ... other properties, etc }

La funcionalidad que está buscando: para envolver una propiedad de estilo de Java Bean existente en una propiedad observable JavaFX se implementa por clases en el paquete javafx.beans.property.adapter . Entonces, por ejemplo, podrías hacer

StringProperty nameProperty = new JavaBeanStringPropertyBuilder() .bean(bean) .name("name") .build();

Vocación

nameProperty.set("James");

con esta configuración causará una llamada efectiva a

bean.setName("James");

Si el bean admite PropertyChangeListener s, JavaBeanStringProperty registrará un PropertyChangeListener con el bean. Cualquier cambio en la propiedad de name de Java Bean será traducido por JavaBeanStringProperty en cambios de propiedad de JavaFX. En consecuencia, si el JavaBean subyacente es compatible con PropertyChangeListener s, entonces cambia al bean vía

bean.setName(...);

dará como resultado cualquier ChangeListener s (o InvalidationListener s) registrado con JavaBeanStringProperty siendo notificado del cambio.

Entonces, por ejemplo, si la clase Bean es

import java.beans.PropertyChangeListener; import java.beans.PropertyChangeSupport; public class Bean { private String name ; private final PropertyChangeSupport propertySupport ; public Bean(String name) { this.name = name ; this.propertySupport = new PropertyChangeSupport(this); } public Bean() { this(""); } public String getName() { return name ; } public String setName(String name) { String oldName = this.name ; this.name = name ; propertySupport.firePropertyChange("name", oldName, name); } public void addPropertyChangeListener(PropertyChangeListener listener) { propertySupport.addPropertyChangeListener(listener); } }

Luego el siguiente código:

Bean bean = new Bean(); StringProperty nameProperty() = new JavaBeanStringPropertyBuilder() .bean(bean) .name("name") .build(); nameProperty().addListener((obs, oldName, newName) -> System.out.println("name changed from "+oldName+" to "+newName)); bean.setName("James"); System.out.println(nameProperty().get());

producirá la salida:

name changed from to James James

Si JavaBean no admite PropertyChangeListener s, los cambios en el bean vía bean.setName(...) no se propagarán a ChangeListener o InvalidationListener s registrados con JavaBeanStringProperty .

Entonces, si el frijol es simplemente

public class Bean { public Bean() { this(""); } public Bean(String name) { this.name = name ; } private String name ; public String getName() { return name ; } public void setName(String name) { this.name = name ; } }

JavaBeanStringProperty no tendría forma de observar el cambio, por lo que el detector de cambios nunca sería invocado por una llamada a bean.setName() . Por lo tanto, el código de prueba anterior simplemente generaría

James

Quiero usar las propiedades de JavaFX para el enlace de UI, pero no las quiero en mis clases de modelo (ver Uso de las propiedades de javafx.beans en las clases de modelo ). Mis clases modelo tienen getters y setters, y quiero crear propiedades basadas en ellos. Por ejemplo, asumiendo un bean instancia con los métodos String getName() y setName(String name) , escribiría

SimpleStringProperty property = new SimpleStringProperty(bean, "name")

esperando que property.set("Foobar") active una llamada a bean.setName . Pero esto no parece funcionar. ¿Qué me estoy perdiendo?