Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Java] Classi con riferimenti incrociati

    Ciao, ho un problema che non riesco a risolvere.
    Ho due classi che si devono referenziare a vicenda.
    Una classe ConnecterServer che gestisce una connessione, estende la classe Thread ed è sempre attiva.
    Una classe ServerGui che realizza l'interfaccia grafica.

    Alla gui nel costruttore gli passo la classe ConnecterServer perchè così alla pressione di alcuni tasti può richiamare dei metodi di quest'ultima.

    Vorrei poter passare la gui al worker in modo tale che in seguito a certi eventi possa aggiornare dei componenti della gui (text).

    Per ora il codice di inizializzazione delle due classi è il seguente, così come è scritto la gui può richiamare metodi di ConnecterServer ma quest'ultimo non può aggiornare la gui.

    codice:
    ConnecterServer connecter = new ConnecterServer();
    ServerGui gui=new ServerGui(connecter);

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Classi con riferimenti incrociati

    Originariamente inviato da cicciofranco
    codice:
    ConnecterServer connecter = new ConnecterServer();
    ServerGui gui=new ServerGui(connecter);
    connecter.setServerGui(gui);

    setServerGui lo implementi tu ... ovviamente.

    E visto che ci siamo e che hai parlato di un thread a sé stante, tieni sempre presente le questioni legate al threading e al EDT (event dispatch thread). L'aggiornamento della interfaccia utente (qualunque setXX o altro sui componenti), salvo pochi casi particolari e documentati, va fatto solo ed esclusivamente nel contesto del EDT .... non di un altro thread come quello che fai partire.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ho risolto! Grazie per la risposta.

    Per risolvere ho utilizzato un BoundedBuffer come middleware.

    codice:
    BoundedBuffer bbuffer = new BoundedBuffer(10);
    
    // la gui inserisce i messaggi per connecter all'interno del boundedbuffer
    ServerGui gui = new ServerGui(bbuffer);
    
    // connecter può richiamare metodi di gui per aggiornare la gui
    ConnecterServer connecter = new ConnecterServer(gui);
    
    // carrier resta in ascolto sul bbuffer e avvisa connecter quando c'è qualcosa
    Carrier carrier = new Carrier(bbuffer, connecter);
    Richiamare metodi della gui per il suo aggiornamento è concettualmente corretto?
    Es:
    codice:
    setLabel1(String t){
        label1.setText(t);
    }

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da cicciofranco
    Per risolvere ho utilizzato un BoundedBuffer come middleware.
    Non so cosa è/fa il tuo BoundedBuffer (anche se potrei supporlo dal nome) e meno ancora il tuo Carrier ... comunque, ok se hai risolto.

    Originariamente inviato da cicciofranco
    Richiamare metodi della gui per il suo aggiornamento è concettualmente corretto?
    Es:
    codice:
    setLabel1(String t){
        label1.setText(t);
    }
    La questione è: nel contesto di quale thread?? Ribadisco che operazioni sulla interfaccia utente vanno fatte (salvo alcuni casi) nel contesto del EDT. Se questo setText lo stai invocando nel contesto del tuo thread no, non va bene. Devi usare il solito invokeLater() di SwingUtilities.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok, grazie mille!

    Per quanto riguarda il BoundedBuffer è un monitor che gestisce una queue limitata (bounded), è una tipica soluzione per il producer-consumer problem.

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.