Newsgroup: it.comp.java
Titolo: JSF - Aggiungere Listener ad un Custom Component

Saluti
ho creato un Custom Component:
<myTag:comuni value="#{comune.cap}" id="comuneNascita"  size="20"/>
vorrei che, senza che si dichiari niente, il componente abbia un suo
Listener gestito internamente dal componente stesso.
Qualcosa del tipo:
public class UIComuni extends UIInput {
 public UIComuni() {
        setRendererType(null); // this component renders itself
        FacesContext context = FacesContext.getCurrentInstance();
      // IL PROBLEMA è come attaccare al componente un
      // ValueChangeListener che richiama il metodo onChange (vedi
sotto)
      //  come aggiungo il LISTENER ???
     ....
     ....
     ....
    }
     public void onChange(ValueChangeEvent event) {
	// fai qualcosa
     } // onChange
 ...
...
}
grazie mille per ogni aiuto...
:O)


Hai provato con:
nel costruttore della tua sottoclasse di UIInput
addValueChangeListener(new ValueChangeListener() {
   public void processValueChange(ValueChangeEvent event) {
      //codice tuo
   }
});
?


Ciao
grazie per la risposta
:O)
ho provato ma ottengo errore:
---------------------------------------------------------------------------------------------------------------------------------------------
java.lang.IllegalStateException: com.lof.tag.UIComuni$1
	javax.faces.component.StateHolderSaver.restore(StateHolderSaver.java:
98)
 
javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:
1406)
 
javax.faces.component.UIComponentBase.restoreState(UIComponentBase.java:
1272)
	javax.faces.component.UIOutput.restoreState(UIOutput.java:214)
	javax.faces.component.UIInput.restoreState(UIInput.java:1233)
 
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:
1141)
 
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:
1157)
 
javax.faces.component.UIComponentBase.processRestoreState(UIComponentBase.java:
1157)
 
com.sun.faces.application.StateManagerImpl.restoreView(StateManagerImpl.java:
171)
 
com.sun.faces.application.ViewHandlerImpl.restoreView(ViewHandlerImpl.java:
290)
 
com.sun.faces.lifecycle.RestoreViewPhase.execute(RestoreViewPhase.java:
141)
	com.sun.faces.lifecycle.LifecycleImpl.phase(LifecycleImpl.java:251)
	com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:117)
	javax.faces.webapp.FacesServlet.service(FacesServlet.java:244)
---------------------------------------------------------------------------------------------------------------------------------------------
ecco il frammento della classe:
public class UIComuni extends UIInput {
	 public UIComuni() {
        // setConverter(new IntegerConverter()); // to convert the
submitted value
        setRendererType(null); // this component renders itself
        ValueChangeListener listener = new ValueChangeListener() {
        public void processValueChange(ValueChangeEvent event) {
     		   System.out.println("SALUTISSIMIIIIIII");
     	   }
        };
     	  addValueChangeListener(listener);
        ......
};
bye....

98)
Hmm..
Puoi provare ad aggiungere un f:valueChangeListener attraverso la JSP?
<r:componente>
  <f:valueChangeListener="classe.che.implementa.ValueChangeListener"/>
</r:componente>
e vedere se da lo stesso problema?
Dopo tutto il tag f:valueChangeListener fa quello che ti ho detto di fare, 
niente di piu'.

Non puoi definire il tuo valueChangeListener come classe interna anonima 
(e la stessa cosa vale per gli altri listener). Puoi definire il tuo 
valuechangelistener in una classe interna statica. Esempio:
public class UIComuni extends UIInput {
     /** Creates a new instance of MyComponent */
     public UIComuni {
         addValueChangeListener(new MyValueChangeListener());
     }
     public static class MyValueChangeListener implements 
ValueChangeListener
     {
         public void processValueChange(ValueChangeEvent event) throws 
AbortProcessingException {
                System.out.println("hello world");
         }
     }
}
In questo modo dovrebbe funzionare,
ciao !
Emanuele
Rsorrt ha scritto:



Per la Peppa...!!!!!!
ci siamo...
finalmente funziona.
Grazie 1000 a te
e grazie a Cicap per essere intervenuti nel problema.
Bye......
buon weekend....!!!
:O))))
Funziona.... ok....

 (e la stessa cosa vale per gli altri listener).
Posso sapere il motivo? 

 ha scritto nel messaggio 
news:mWnsi.80911$U01.7...@twister1.libero.it...

Problemi di serializzazione e/o deserializzazione delle classe anonime 
immagino...ma mi piacerebbe sapere esatamente cosa accadeva. 

cicap ha scritto:

Hai individuato il problema, solo che non riguarda JSF ma java; infatti 
non è possibile serializzare/deserializzare le classi interne anonime.
Credo che qua troverai documentazione in abbondanza sul problema:
http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4862448
Ciao !
Emanuele

Saluti
Sto facendo eseprimenti
ma mi rendo conto di una cosa curiosa
vedo che il Listener viene chiamato più di una volta:
in pratica ho:
   UIComuni--->costruttore
   UIComuni--->encodeBegin
   UIComuni--->encodeInputField
   UIComuni--->costruttore
   UIComuni--->decode
   MyValueChangeListener
   MyValueChangeListener
   UIComuni--->encodeBegin
 Vedo due chiamate al Listener consecutive, e infatti il costruttore
viene chimato 2 volte.
public UIComuni() {
   System.out.println("\n\n ------ UICOMUNI-->costruttore ------
\n");
   setRendererType(null); // this component renders itself
    addValueChangeListener(new MyValueChangeListener());
- Nascondi testo tra virgolette -
- Mostra testo tra virgolette -

Il TAG a questo punto diverrà non più un InputText ma un ListBox che
Sei sicuro che la tua soluzione sia meglio di  una cosa come questa?
http://www.google.com/webhp?complete=1&hl=en
(prova a digitare qualcosa nel' input).
Di componenti che fanno questo ce ne sono a bizzeffe.
In particolare prova con quello distribuito dalla librerie RichFaces se ti 
interessa il mio suggerimento.
http://livedemo.exadel.com/richfaces-demo/richfaces/suggestionBox.jsf?c=suggestionBox
 

 interessa il mio suggerimento.
http://livedemo.exadel.com/richfaces-demo/richfaces/suggestionBox.jsf.
..
Ma certo che mi interessa il tuo suggerimento....
vado subito a vedere di cosa si tratta poi ci risentiamo..
Grazie.
bye...


Beh..
RichFaces è indubbiamente interessante... ho scaricato e nel fine
settimana me lo guardo.
Continuo poi le prove con il custom component in oggetto di questo
post
per apprendere meglio il funzionamento del framework Jsf.
Quindi suggerimenti in merito sono benvenuti...
:O)
saluti e buon weekend.