Newsgroup: it.comp.java
Titolo: JTextArea e output del server

Volevo riproporvi il problema che ho sollevato qualche thread fa riguardo al
fatto che non riesco a visualizzare l'output di un server su di un oggetto
di tipo JTextArea , mentre se tento di mandarlo a video con il classico
System.out.println() funziona correttamente.
Provo a postarvi i due metodi " incriminati" : il primo metodo " stabilisci
connessione " ovviamente stabilisce la connessione col server :
*****************************************
private void stabilisciConnessione(){
  try
 {
  //crea la connessione all'host remoto
   soc = new java.net.Socket("localhost" ,55000);
   soc.setSoTimeout(500000);
 out = soc.getOutputStream();
 // metodo che mi ritorna l'oggetto JTextArea sul quale vado a scrivere
 getJTextArea1().setText("Connessione in corso ....");
 leggiCoseDalServer();
 }
  catch(IOException ioe)
 {
  System.out.println("Connection failed" + "" + ioe.toString());
 }
}
********************************************
Poi vi posto il metodo " incriminato" che si chiama " leggiCoseDalServer "
che è chiamato da quest'ultimo:
********************************************
private void leggiCoseDalServer() throws IOException{
 BufferedReader buffRead = new BufferedReader(new
InputStreamReader(soc.getInputStream()));
    // out è l'oggetto OutputStream
   ps = new PrintStream(out);
   ps.println("NICK Diprivan");
   ps.println("USER guest 0 * :Massimiliano");
  boolean eof= false;
  while(!eof)
  {
   String riga = buffRead.readLine();
    if(riga!= null)
    {
     getJTextArea1().setText(riga);  // è questa istruzione qui che pare non
funzionare , o forse è sbagliato il ciclo
    }
    else
    {
     eof= true;
    }
  }
}
******************************
Grazie a chiunque volesse tentare di aiutarmi.
Saludos
Max
--
"...con le stagioni a passo di java..."
                                             ( FDA )

 nell'altro thread?
Si ho provato , ma ho capito che il problema non č dovuto all'oggetto
JTextArea , bensě al ciclo di lettura.
Infatti ho provato a togliere il ciclo e dirgli di leggere solo la prima
riga dell'output del server e funziona perfettamente: visualizzo sulla
JTextArea la prima riga del messaggio di benvenuto del server.
Il ciclo che uso io per leggere l'output č questo :
*****************
boolean eof= false;
  while(!eof)
  {
   String riga = buffRead.readLine();
    if(riga!= null)
    {
     getJTextArea1().setText(riga);
  }
    else
    {
     eof= true;
      }
  }
*******************
Ho capito che il problema č qui.
Nel senso : ho come il sospetto che lui non abbia il tempo di scrivere sulla
JTextArea mano a mano che legge cose sul server :-(
Infatti probabilmente scrivere in consolle fa prima e il ciclo funziona , se
deve scrivere sulla JTextArea si incasina.
Hai in mente un altra maniera per fargli leggere dal server , magari con un
altro tipo di ciclo ?
Grazie e ciao


innanzitutto ti consiglio di usare
JTextArea.append(String s) invece di setText().
Poi credo che dovresti mettere il metodo leggiCoseDalServer in un thread
separato,
ad esempio prova con l'implementare l'interfaccia Runnable.
public void run(){
    try{
        leggiCoseDalServer()
    }
    catch(IOException ioe){}
}
e subito dopo il metodo stabilisciConnessione, al posto di chiamare
leggiCoseDalServer(),
fai la chiamata:
new Thread(this).start();
spero che funzioni.
Ciao.

 separato,
Wow ... grazie mille !!!
Gestendo la cosa coi threads funziona !!!
L'unica cosa č che non capisco come mai con l'output su consolle funziava
anche senza threads e invece con l'output su JTextArea ha bisogno dei
threads .
Grazie ancora per la dritta e ciao :-)


 threads .
Con le GUI devi sempre fare attenzione a questo tipo di problematiche.
Ciao.

 threads .
Il problema č legato probabilmente alla gestione degli eventi della GUI da
parte di Java.
Leggiti il tutorial sull'uso di Swing al paragrafo "Threads and Swing" per
qualche nozione....
Bye
Johnny


 Grazie ancora per la dritta e ciao :-)
Citando il tuo codice
boolean eof= false;
  while(!eof)
  {
   String riga = buffRead.readLine();
    if(riga!= null)
    {
     getJTextArea1().setText(riga);
  }
    else
    {
     eof= true;
      }
  }
ad ogni iterazione del ciclo il testo della textarea viene cambiato, e resta
visualizzata solo l'ultima riga letta. Non c'entrano i thread (per carità,
usarli non fa male). Usa un'append oppure leggi prima tutto il testo e poi
scrivilo nella textarea.
O meglio ancora, usa una JTextPane e utilizza il metodo
public void read(InputStream in, Object desc) throws IOException
~~
artemis.alpeia

 scrivilo nella textarea.
ho suggerito anch'io che bisognava usare append()
ma IMHO è necessario usare anche un thread separato, a meno che non
voglia vedere un frame totalmente bloccato e probabilmente neanche
il testo aggiornato nella textarea.
Altra soluzione è forse EventQueue.invokeLater

 Altra soluzione è forse EventQueue.invokeLater
infatti, Antonio, non ho nulla da dire sull'uso dei thread. Solo che con il
problema di MaxVanLoon non c'entravano, almeno IMO. Il problema era quella
chiamata ripetuta a setText.
Saluti :)
~~
artemis.alpeia