Java dostęp do formatki z innego wątku

0

Witam
Chce napisać aplikacje sieciową w swing. Tworze sobie nowy wątek do nasłuchu portu w którym mam nieskończoną pętle w której odczytuje dane ze strumienia.
Jak w tym wątku mogę dostać się do wątku głównego aby mieć dostęp do texfields?

0

A co wątki mają do tego? o_O o_O Przekaż do tego swojego obiektu (wątku) referencje do obiektów do których chcesz mieć dostęp.

0

No tak ale to trochę bez sensu przekazywać referencje w konstruktorze dla kilku-kilkunastu textfields.

0

To przekaż do okna które te texfieldsy agreguje? ;]

0

Czyli wystarczy że pośle w konstruktorze "this"?

0

Wystarczy, chociaż ja bym spytał czy jest to najlepsze rozwiązanie ;)

0

Jak to robią profesjonaliści :) ?
Do tej pory pisałem c# i tam tak prosto nie było trzeba było wywoływać delegatów

0

Dobrze, przedstawie kod:

Chce napisać aplikacje która jest klientem do serwera.Mam 3 klasy pierwsza "sender" która łączy się z serwerem i wysyła okresowo zapytanie do serwera, druga "Listener" która nasłuchuje na odpowiedź i ma aktualizować textfieldy, trzecia klasa to klasa od gui gdzie na zdarzenie odpalam timer oraz tworze wątek do nasłuchu. Jak uaktualnić textfieldy w klasie Listener, bo raczej bez sensu przekazywać referencje do wszystkich textfieldów w konstruktorze.

Kod:

 
public class Sender extends TimerTask
{  
 
   private final byte[] _buforOut=new byte[] { 0x00, 0x02, 0x00, 0x00, 0x00, 0x06, 0x01, 0x01, 0x00, 0x00, 0x00, 0x05 };
 
  
   Socket _mySocket;
   DataOutputStream _dataOutputStream;
   OutputStream _outputStream;
   
    public Sender (Socket _mySocket)
    {
        this._mySocket=_mySocket;
        
    }
    
    public void run() 
    {
        try
        {
            if(!_mySocket.isConnected())
            {
               _mySocket.connect(new InetSocketAddress("192.168.1.200", 3000));
               _outputStream=_mySocket.getOutputStream();
               _dataOutputStream=new DataOutputStream(_outputStream);
            }
            
           _dataOutputStream.write(_buforOut, 0, _buforOut.length);
        }
        catch(IOException ex)
        {
          javax.swing.JOptionPane.showMessageDialog(null,ex.getMessage(),"Error",JOptionPane.ERROR_MESSAGE); 
        }
       
      
    }
    
}
 blic class Listener implements Runnable {
    
 private final byte[] _buforIn=new byte[25];
  
 Thread _thread;
 InputStream _inputStream;
 DataInputStream _dataInputStream;
 Socket _mySocket;
 

 
  Listener(Socket _mySocket)
  {
       this._mySocket=_mySocket;
      _thread=new Thread(this,"Komunikacja");
      _thread.start();
   
  }
    
    public void run()
    {
        
        while(true)
        {
           try
           { 
               //x.setText(" ");
             Thread.sleep(100);
             if(_mySocket.isConnected())
             {
              _inputStream=_mySocket.getInputStream();
              _dataInputStream=new DataInputStream(_inputStream);
             }
             else continue;
             
             _dataInputStream.read(_buforIn, 0, _buforIn.length);
           
           }
           catch(Exception ex) {continue;}
           /*
            Tu ma być uaktualnienie textfieldów
          */
          // x.setText(String.valueOf(_buforIn[15])+" "+String.valueOf(_buforIn[16])+" "+_buforIn[17]+" "+String.valueOf(_buforIn[18]));
             for(byte i:_buforIn) i=0;
        }
    }
}
 public class GUI extends javax.swing.JFrame {

   Timer _timer;
   Socket _mySocket;
  // OutputStream _outputStream;
   Sender _sender;
   Listener _listener;
   
  
   
    public GUI() {
         initComponents();
        _timer= new Timer();
        _mySocket=new Socket();
        _listener=new Listener(_mySocket);
        _sender= new Sender(_mySocket);
       
    }
0

Już Ci @Shalom napisał, przekaż referencję do całego okna:

_listener = new Listener(_mySocket,this);
0

Ale te wszystkie elementy formatki są prywatne wiec tam się nie dostane z klasy Listener

0

To utwórz w klasie z GUI gsettery.

0

Skorzystaj z EventBus: http://square.github.io/otto/

0

Jeszcze jedna sprawa jest coś takiego w java dla wątków jak isBackground tak jak w c#?
Chodzi mi o to czy wątek z klasy Listener muszę ręcznie zamknąć czy stanie się to automatycznie wraz z wywołaniem this.dispose();

1 użytkowników online, w tym zalogowanych: 0, gości: 1