Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456

    SetText() non funziona se effettuato da un'altra classe

    Ciao,
    sto cercando di cambiare il testo di un JLABEL che sta nella classe A, facendo l'operazione in un metodo che sta nella classe B.

    nella classe B faccio questa operazione

    codice:
    public class B{
         public void scrivi(){
              A classA = new A();
              classA.nomeJLabel.setText("scrivi"); 
        }
     }

    Non funziona e non ricevo messaggi di errore. La cosa strana è che se faccio:
    codice:
    classA.nomeJLabel.setText("scrivi")	;
    System.out.println(classA.nomeJLabel.getText());
    Ottengo il testo "scrivi" , ma visivamente la JLabel non cambia testo

  2. #2
    Forse devi refreshare l'interfaccia grafica.
    Prova con repaint()


    un'altra cosa da controllare e' : il metodo scrivi() viene chiamato nell' Event Dispathcing Thread ?

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456
    leggendo la documentazione sono arrivato al The Event Dispatch Thread di cui parlavi tu. Anche se ancora non ho capito cosa sia.
    Tra l'altro ho letto che i componenti Swing non sono thread safe, poi in una pagina della documentazione di oracle si dice che setText() è trade safe

  4. #4
    L'EDT e' un thread che gestisce l'interfaccia grafica. Non lo crei esplicitamente ma viene creato quando tiri su una GUI. la classe SwingUtilities ha un metodo per capire se sei in quel thread : isEventDispatchingThread o roba simile.

    Cmq se setText() e' thread safe non dovrebbe essere li il problema.

    se usi l'istruzione
    codice:
    A classA = new A();
    Forse stai creando una nuova classe A che non e' quella che stai visualizzando al momento.
    Non so che altro dirti

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456
    ah, è vero. io creo un altro oggetto A. non quello che vedo a video.
    Come faccio a fare questa operazione allora? Devo avere per forza la JLabel nella stessa classe in cui ho il metodo che ne cambia il testo?

  6. #6
    oppure passi l'oggetto A o la JLabel come parametro a scrivi()

    codice:
    public void scrivi(A classeA){
               ......
    }

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456
    Ho reso static la JLabel della classe A, in questo modo posso richiamarla dalla classe B con B.nomelabel.setText("testo")

    Forse era quesot il problema.
    Che agivo su un oggetto della classe A che non era quello che vedevo a video.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da matpirata
    Ho reso static la JLabel della classe A, in questo modo posso richiamarla dalla classe B con B.nomelabel.setText("testo")

    Forse era quesot il problema.
    Che agivo su un oggetto della classe A che non era quello che vedevo a video.
    No. La soluzione non è rendere static la JLabel, ma fornire alla classe B un riferimento alla classe A o alla JLabel della classe A (come ti ha, giustamente, detto Mr.Bloom).


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Jul 2001
    Messaggi
    456
    Ciao,
    ho provato a seguire le vostre istruzioni, e passando l'ggetto JLabel della classe A al metodo della classe B funziona.

    Poi, per curiosità, ho provato a passare un riferimento della classe A al metodo presente nella classe B.

    Ho pensato di fare una cosa del genere:
    nel costruttore della classe A ho messo
    codice:
    A riferimentoClasseA = this;
    poi, sempre, nella classe A ho creato un oggetto della classe B e ne ho richiamato il metodo passandogli come parametro il riferimento alla classe A
    codice:
    B classeb = new B()
    classeb.metododellaclasseb(riferimentoClasseA )
    Nella classe B gestisco così la cosa
    codice:
    public void metododellaclasseb(A riferimentoClasseA ){
    A classeA = riferimentoClasseA;
    riferimentoClasseA.nomeLabel.setTet("bla bla");
    }

    Funziona. Ora vorrei sapere se funziona perchè fatto le cose in maniera corretta, o se funziona per puro caso. Secondo i vostri suggerimenti, le cose andavano gestite così?

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.