Buscar
Social
Ofertas laborales ES

Foro sobre Java SE > Ayuda con PropertyEditor

Hola.

Quiero hacer un editor personalizado para editar una propiedad de un JavaBean. El problema que tengo es que necesito acceder a otra propiedad de ese bean (ya que de esta última depende la edición de la primera) y no sé como hacerlo.

Gracias de antemano.

junio 26, 2014 | Unregistered Commenteralanovich

Como no te expliques con código fuente. Algo habrás hecho ya.

junio 26, 2014 | Registered Commenterchoces

Supongamos que tengo un JavaBean con dos parámetros: A y B. Implemento la interface java.beans.PropertyEditor para editar el parámetro A. Los posibles valores del parámetro A dependen del valor del parámetro B. Mi duda es como acceder al parámetro B en el PropertyEditor. Espero haber aclarado la cuestión.

junio 26, 2014 | Unregistered Commenteralanovich

Puedes implementar directamente el PropertyEditor
http://docs.oracle.com/javase/8/docs/api/java/beans/PropertyEditor.html
o añadirle un PropertyEditorSupport
http://docs.oracle.com/javase/8/docs/api/java/beans/PropertyEditorSupport.html

En cualquier caso, debes incluir en sus métodos las transformaciones que necesites sobre las propiedades de la clase.

Si no publicas un ejemplo concreto, con las propiedades, y los valores que deben devolver esos métodos, no se te puede ayudar mejor.

junio 26, 2014 | Registered Commenterchoces

Bueno, aquí va el código de ejemplo, a ver si así me explico mejor. Van tres clases: el Bean, el PropertyEditor y el un JPanel donde el usuario establece el valor del parametroA. No he comentado que trabajo con Netbeans

public class NewJavaBean {
private String parametroA;
private Integer parametroB;

public String getParametroA() {
return parametroA;
}

public void setParametroA(String parametroA) {
this.parametroA = parametroA;
}

public Integer getParametroB() {
return parametroB;
}

public void setParametroB(Integer parametroB) {
this.parametroB = parametroB;
}
}

----------------------------------

public class NewJavaBeanParametroA_Editor implements PropertyEditor {

private NewJavaBeanParametroA_Panel c = new NewJavaBeanParametroA_Panel();
private String parametroA;

// Si el parametroA ya tiene un valor en NewJavaBean, aquí lo pasa
@Override
public void setValue(Object o) {
if(o == null) {
//Aquí podría darle un valor al parametroA o dejarlo null y que lo
//establezca el NewJavaBeanParametroA_Panel
}
else {
parametroA = (String) o;
}
}

@Override
public String getJavaInitializationString() {
parametroA = c.getParametroA();
// Aquí genero el código que Netbeans insertara en el método
// initComponents()
}

@Override
public Component getCustomEditor() {
/**
* ¿Cómo puedo acceder al parametroB?
**/
c.setParametroB(parametroA, parametroB);
return c;
}
}

--------------------------------------

//Aquí se edita visualmente el parametroA. Los posibles valores del parametro A
//dependen del parametroB
class NewJavaBeanParametroA_Panel extends JPanel {

private String parametroA;
private Integer parametroB;

public void setParametros(String parametroA, Integer parametroB) {
this.parametroA = parametroA;
this.parametroB = parametroB;
}

public String getParametroA() {
return parametroA;
}
}

La duda es: ¿Cómo puedo acceder al parametroB en el PropertyEditor?

junio 26, 2014 | Unregistered Commenteralanovich

Hay un error en la clase NewJavaBeanParametroA_Editor. el metodo getCustomEditor() queda así:

@Override
public Component getCustomEditor() {
/**
* ¿Cómo puedo acceder al parametroB?
**/
c.setParametros(parametroA, parametroB);
return c;
}
}

junio 26, 2014 | Unregistered Commenteralanovich

public class NewJavaBeanParametroA_Panel extends JPanel {

private String parametroA;
private Integer parametroB;

public void setParametros(String parametroA, Integer parametroB) {
this.parametroA = parametroA;
this.parametroB = parametroB;
}

public String getParametroA() {
return parametroA;
}

/**
@return the parametroB
*/
public Integer getParametroB() {
return parametroB;
}

}

junio 26, 2014 | Registered Commenterchoces

public class NewJavaBeanParametroA_Editor implements PropertyEditor {

private NewJavaBeanParametroA_Panel c = new NewJavaBeanParametroA_Panel();
private String parametroA;
private int parametroB;

// Si el parametroA ya tiene un valor en NewJavaBean, aquí lo pasa
@Override
public void setValue(Object o) {
if (o == null) {
//Aquí podría darle un valor al parametroA o dejarlo null y que lo
//establezca el NewJavaBeanParametroA_Panel
} else {
parametroA = (String) o;
}
}

@Override
public String getJavaInitializationString() {
parametroA = c.getParametroA();
parametroB = c.getParametroB();
// Aquí genero el código que Netbeans insertara en el método
// initComponents()
}

@Override
public Component getCustomEditor() {
/**
¿Cómo puedo acceder al parametroB?
* */
c.setParametros(parametroA, parametroB);
return c;
}

@Override
public Object getValue() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public boolean isPaintable() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void paintValue(Graphics gfx, Rectangle box) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public String getAsText() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void setAsText(String text) throws IllegalArgumentException {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public String[] getTags() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public boolean supportsCustomEditor() {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void addPropertyChangeListener(PropertyChangeListener listener) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}

@Override
public void removePropertyChangeListener(PropertyChangeListener listener) {
throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
}
}

junio 26, 2014 | Registered Commenterchoces

Gracias choces por el intento y tu tiempo.

La pregunta sigue siendo: ¿Cómo accedo a parametroB desde el PropertyEditor?

junio 26, 2014 | Unregistered Commenteralanovich

Esa pregunta ya está contestada en la clase NewJavaBeanParametroA_Panel de más arriba.

public Integer getParametroB() {
return parametroB;
}

Y en la clase NewJavaBeanParametroA_Editor

@Override
public String getJavaInitializationString() {
parametroA = c.getParametroA();
parametroB = c.getParametroB();
// Aquí genero el código que Netbeans insertara en el método
// initComponents()
}

junio 26, 2014 | Registered Commenterchoces

El parametroB al que necesito acceder es el de NewJavaBean. En en codigo que pones tanto NewJavaBeanParametroA_Editor como NewJavaBeanParametroA_Panel declaran un parametroB pero en ningún momento toma el valor de NewJavaBean. Recuerda que NewJavaBeanParametroA_Editor es el PropertyEditor para el parametroA (de NewJavaBean) y que recibe el valor de éste (si lo tiene) a través del método setValue(Object o) (es el método que usa Netbeans para pasarleel valor de la propiedad a editar) y si no lo tiene será el usuario el que lo establezca en NewJavaBeanParametroA_Panel. Pero necesito tener el valor de parametroB ya que en función de éste, el parametroA podrá tener unos valores u otros.
Por ejemplo: parametroB = 1 entonces parametroB puede ser: A, B o C. Si parametroB = 2 entonces parametroA puede ser H, I o J.
Dicho de otro modo: necesito acceder a la instancia de NewJavaBean en el PropertyEditor de una de sus propiedades (parametroA) para poder acceder a otra de sus propiedades (parametroB). La instancia de NewJavaBean es un componente de un contenedor (podría ser un JPanel, Jframe, etc) en la vista de diseño de Netbeans.

junio 26, 2014 | Unregistered Commenteralanovich

Con propiedades con el mismo nombre es clases diferentes, lo raro es no confundirse.
No veo dónde se crea la instancia de NewJavaBean, de manera que se acceda a sus propiedades. Supongo que se hace, en algún momento en NewJavaBeanParametroA_Panel, porque si no, no entiendo nada.

junio 26, 2014 | Registered Commenterchoces

Seguramente este tutorial te servirá de mucha ayuda:

http://javadude.com/articles/propedit/

junio 26, 2014 | Registered Commenterchoces

Lamento la confusión con los nombres.

La instancia de NewJavaBean se crea en la vista de diseño de Netbeans, pongamos por caso un JPanel, al arrastrarlo desde la paleta o desde el navegador de archivos. Aparece como un componente, y al seleccionarlo sus propiedades se muestran en el panel de propiedades de Netbeans y ahí tengo la posibilidad de editar la propiedad si, para ésta, he implementado un PropertyEditor y lo he asociado en el BeanInfo correspondiente.

El problema es que el PropertyEditor no recibe el JavaBean. Si la propiedad a editar no depende del valor de otra, no hay problema, se crea un nuevo valor y punto. En mi caso la propiedad que quiero editar depende de otra, por lo que tengo que acceder a ese valor y no sé cómo. Poder se puede, porque he visto como algún editor de propiedades de netbeans permite seleccionar en un combo componentes instanciados en la vista de diseño. Por ejemplo: si editamos la propiedad model de un JTable se abre un dialogo donde, desde un combo, podemos seleccionar un opción que pone "value from existing component". Desde ahí podemos seleccionar un componente (en este caso un TableModel que hayamos previamente instanciado) o, incluso, acceder a las propiedades de otros componentes instanciados.

Entiendo que debe haber alguna clase que, a través de un método estatico, devuelva los componentes instanciados. He probado con org.openide.util.Lookup pero no funciona, no se si porque no lo estoy haciendo bien o porque no es la clase que necesito.

Ten en cuenta que el PropertyEditor funciona en tiempo de diseño, no de ejecución.

junio 26, 2014 | Unregistered Commenteralanovich