Java dostęp do formatki z innego wątku

Java dostęp do formatki z innego wątku
K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
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?

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
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.


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
edytowany 1x, ostatnio: Shalom
K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
0

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

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
0

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

Shalom
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 3 lata
  • Lokalizacja:Space: the final frontier
  • Postów:26433
0

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


"Nie brookliński most, ale przemienić w jasny, nowy dzień najsmutniejszą noc - to jest dopiero coś!"
K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
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

K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
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:

Kopiuj
 
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); 
        }
       
      
    }
    
}
Kopiuj
 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;
        }
    }
}
Kopiuj
 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);
       
    }
edytowany 2x, ostatnio: bogdans
bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

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

Kopiuj
_listener = new Listener(_mySocket,this);

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
0

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

bogdans
Moderator
  • Rejestracja:prawie 17 lat
  • Ostatnio:prawie 5 lat
0

To utwórz w klasie z GUI gsettery.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell
edytowany 2x, ostatnio: bogdans
Shalom
gettery ;)
0

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

K2
  • Rejestracja:ponad 13 lat
  • Ostatnio:ponad 10 lat
  • Postów:142
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();

Olamagato
  • Rejestracja:ponad 16 lat
  • Ostatnio:około 2 miesiące
  • Lokalizacja:Polska, Warszawa
  • Postów:1058
0

Jeżeli ktoś komuś coś, ewentualnie nikt nikomu nic, to właściwie po co...?

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.