Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114

    [JAVA] oggetti di classi diverse...

    codice:
    class Finestra extends Frame{
    	
    	TextArea output1,output2;
    	
    	Panel p1,p2;
    	
    	Finestra(){
    		
    		setSize(250,120);
    		setTitle("Corsa dei thread");
    		setResizable(false);
    		setLayout(new BorderLayout());
    		
    		output1 = new TextArea(4,5);
    		output2 = new TextArea(4,5);
    		priorita1 = new TextField(1);
    		priorita2 = new TextField(1);
    		p1=new Panel();
    		p2=new Panel();
    		
    		
    		
    		p1.setLayout(new GridLayout(3,1));
    		p1.add(output1);
    		p1.add(priorita1);
    		add(p1,BorderLayout.WEST);
    		
    		p2.setLayout(new GridLayout(3,1));
    		p2.add(output2);
    		p2.add(priorita2);
    		add(p2,BorderLayout.EAST);
    				
    		setVisible(true);
    	}
    	
    	
    }
    
    
    class Thread1 implements Runnable{
    	
    	Thread t;
    	
    	Thread1(){
    		
    		t= new Thread(this,"THREAD1");
    		t.start();
    		
    	}
    	
    	public void run(){
    		
    		for (int i=0;i<1000;i++)
    		
    			output1.setText(i);	// ???
    			
    	}
    	
    }
    
    public class esempio{
    		
    	public static void main(String args[]){
    		
    		Frame f = new Finestra();
                    new Thread1();
    			
    	}
    }
    Vi ho postato il codice per far capire meglio. Forse avrò qualche lacuna di base(poche settimane che uso java) ma vorrei capire...

    Creo una finestra con una textarea e all' interno di essa voglio visualizzare del testo. Quest' ultima azione deve esser fatta da un altro thread. Adesso mi chiedo: Come posso far usare la textarea "output" ad un oggetto della classe thread1?? Visto che non appartengono alla stessa classe?? Spero di esser stato chiaro...

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Devi passare un riferimento alla TextArea (oppure alla finestra, predisponendo dei metodi) alla classe "esterna". Grossomodo la struttura è questa:
    codice:
    Classe1 {
       private OggettoPrivato obj;
    
       metodo() {
          // Costruisco un oggetto della classe esterna
          // e gli passo un riferimento all'oggetto interno
          // che dovrà modificare o su cui dovrà lavorare
    
          Classe2 oggetto = new Classe2( obj );  // <-- nota il passaggio dell'oggetto al costruttore
    
          // Dico all'oggetto di operare
          oggetto.suoMetodo();
       }
    }
    
    Classe2 {
       private OggettoPrivato o;
       Classe2(OggettoPrivato o) {
          // Questa classe contiene un riferimento ad un oggetto privato
          this.o = o;
       }
    
       suoMetodo() {
          // Qui opero con l'oggetto privato dell'altra classe
          o.faiQualcosa();
       }
    }
    In alternativa è possibile predisporre dei metodi pubblici nella classe che contiene l'oggetto da modificare e passare un riferimento alla classe, in modo che ne vengano, poi, utilizzati i metodi.


    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

  3. #3
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114
    Diciamo che ho capito il senso... pero' nn riesco ad applicarlo al codice che ho postato.... un aiutino?????

    Grazie

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Nell'esempio che hai postato tu dovresti utilizzare il secondo metodo, dato che hai una terza classe che avvia la prima ed il thread. Una cosa: la variabile i è di tipo intero, mentre setText vuole una String... basta il trucchetto della concatenazione
    codice:
    class Finestra extends Frame{
    	
    	TextArea output1,output2;
    	
    	Panel p1,p2;
    	
    	Finestra(){
    		
    		setSize(250,120);
    		setTitle("Corsa dei thread");
    		setResizable(false);
    		setLayout(new BorderLayout());
    		
    		output1 = new TextArea(4,5);
    		output2 = new TextArea(4,5);
    		priorita1 = new TextField(1);
    		priorita2 = new TextField(1);
    		p1=new Panel();
    		p2=new Panel();
    		
    		
    		
    		p1.setLayout(new GridLayout(3,1));
    		p1.add(output1);
    		p1.add(priorita1);
    		add(p1,BorderLayout.WEST);
    		
    		p2.setLayout(new GridLayout(3,1));
    		p2.add(output2);
    		p2.add(priorita2);
    		add(p2,BorderLayout.EAST);
    				
    		setVisible(true);
    	}
    
            // Aggiungo questo metodo che verrà utilizzato dal thread
            public void scriviSullaTextArea(int valore) {
                    output1.setText("" + valore);
            }
    	
    	
    }
    
    
    class Thread1 implements Runnable{
    	
    	Thread t;
            Finestra f;  // <-- Aggiungo un oggetto Finestra (riferimento)
    	
    	Thread1(Finestra f){
    		
                    this.f = f;  // <-- creo il riferimento
    		t= new Thread(this,"THREAD1");
    		t.start();
    		
    	}
    	
    	public void run(){
    		
    		for (int i=0;i<1000;i++)
    		
                           f.scriviSullaTextArea(i);  // <-- Nota: richiamo il metodo.
    			
    	}
    	
    }
    
    public class esempio{
    		
    	public static void main(String args[]){
    		
    		Frame f = new Finestra();
                    new Thread1( (Finestra) f );  // <-- Gli passo il riferimento
    			
    	}
    }
    Forse è meglio se ti spiego anche il perchè di alcune scelte. Cominciamo con la chiamata al costruttore del Thread: ho usato un cast esplicito, perchè tu hai creato un oggetto Finestra dichiarandolo di tipo Frame. Non posso, quindi, passarlo al costruttore così com'è, dato che nel costruttore del thread ho dichiarato, esplicitamente, un oggetto di tipo Finestra. Una alternativa possibile è la seguente:
    codice:
    public static void main(String args[]) {
       Finestra f = new Finestra();
       new Thread1(f);
    }
    Poi ho deciso di passare al metodo scriviSullaTextArea() un tipo int. Così rimani fedelle alla tua convenzione. Una alternativa sarebbe stata quella di passare una stringa, effettuando la concatenazione nel thread:
    codice:
    ...
    public void scriviSullaTextArea(String valore) {
       output1.setText(valore);
    }
    ...
    // Nel Thread:
    f.scriviSullaTextArea("" + i);
    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

  5. #5
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114
    Grazie Lele adesso mi ci metto su

  6. #6
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114
    Sei stato chiarissimo.
    Solo 1 cosa non mi è chiara:

    this.f = f;

    Assegni all' oggetto corrente f il riferimento alla finestra?? Puntano tutti e 2 allo stesso oggetto? Maro' che confusione...


    Grazie

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Esattamente. Il this è necessario solamente in quanto ho dato lo stesso nome al parametro del costruttore e alla variabile d'istanza, quindi devo distinguerle.
    Per il resto, con quell'istruzione, non faccio altro che assegnare alla variabile d'istanza f l'indirizzo della finestra, quindi, qualsiasi metodo richiamato su quell'oggetto, sarà un metodo della finestra che è stata istanziata. Fai attenzione a queste sottigliezze, perchè molti si perdono in queste cose e commettono errori banali come questo:
    codice:
    class Thread1 extends Thread {
       private Finestra f;
       public Thread1() {
          f = new Finestra()
       }
    }
    In questo modo all'interno della classe Thread1 viene creata una nuova finestra, un oggetto diverso da quello che è stato istanziato dalla classe contenente il main. L'operatore new, infatti, crea un nuovo oggetto, mentre lo scopo di quell'oggetto è fornire un puntatore all'oggetto già istanziato su cui chiamare i metodi. Non ha senso (anzi, è sbagliato!) creare una finestra e cercare di lavorarci facendo riferimento ad una finestra diversa.


    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

  8. #8
    Utente di HTML.it
    Registrato dal
    Mar 2000
    Messaggi
    114
    Non so come ringraziarti. Ciao

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 © 2024 vBulletin Solutions, Inc. All rights reserved.