Foro sobre Java SE > Ayuda con PropertyEditor
Como no te expliques con código fuente. Algo habrás hecho ya.
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.
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.
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?
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;
}
}
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;
}
}
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.
}
}
Gracias choces por el intento y tu tiempo.
La pregunta sigue siendo: ¿Cómo accedo a parametroB desde el PropertyEditor?
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()
}
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.
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.
Seguramente este tutorial te servirá de mucha ayuda:
http://javadude.com/articles/propedit/
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.
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.