Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it L'avatar di Pierock
    Registrato dal
    Dec 2008
    Messaggi
    102

    [java] gestire il listener di una classe interna

    salve ragazzi,
    ho un problema alquanto banale... ma sinceramente mi sta facendo perdere un po' di tempo...
    vorrei gestire all'interno di una classe Contenitore il listener implementato all'interno di una classe (ClassInside) contenuta in Contenitore...
    a dire il vero il problema è addirittura più banale, in quanto... riesco a gestire il listener ... ma ho dei problemi riguardo a raccoglierne i frutti dell'esecuzione...
    in quanto il metodo che dovrebbe recuperarli (nella classe Contenitore) prosegue l'esecuzione senza "aspettare" che il listener abbia concluso... beccando di conseguenza dei valori nulli...

    la spiegazione forse lascia a desiderare... vi allego una sorta di pseudocode

    codice:
    
    public class Contenitore {
    
    
        ClassInside inside;
        // altro...
    
    
        
        private void attivaList(){
            this.inside.attiva();
        }
        
        public void esegui(){
            this.attivaList();
            Object = inside.getObj();     // <--
            // errore... l'ogetto è nullo
            // 
            
        }
        
        
    
    
    }
    
    
    public class ClassInside implements MouseListener {
    
    
        // altro...
        private Object Oggetto = null;
        private boolean flag = false;
        private boolean fatto = false;
        
        
        public void attiva(){
            this.flag = true;
        }
        
        public boolean isCreated(){
            return this.fatto;
        }
        
        public Object getObj(){
            return Oggetto;
        }
        
        @Override
        public void mouseClicked(MouseEvent arg0) {
            
            // atro codice.... necessario per la classe
            
            if(this.flag){
                Oggetto = creaOggetto(); 
                this.flag = false;    
                this.fatto = true;
            }
        }
    
    
    }
    dove ho inserito la freccia ovviamente mi da errore... ho provato a modificarlo con qualcosa del tipo

    codice:
    while(!inside.isCreated())
    { }
    ma questa "rozza" soluzione ... ovviamente non funziona affatto...
    cosa mi sfugge? .. svegliatemi!

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Pierock Visualizza il messaggio
    codice:
    while(!inside.isCreated())
    { }
    ma questa "rozza" soluzione ... ovviamente non funziona affatto...
    cosa mi sfugge? .. svegliatemi!
    No, a parte il fatto che se fai un loop di "polling" come quello, rischi pure di tenere bloccato il EDT (dipende in che contesto lo esegui, chiaramente). Ma in ogni caso non è una bella cosa e pertanto non è la soluzione valida.

    Il concetto che stavi cercando di fare è: in esegui voglio aspettare/prendere un oggetto che viene creato ad un evento di click.

    Ma perché "aspettare"? Fai in modo che quando avviene il click, ovvero nel contesto del mouseClicked, alla fin fine fai tutto quello che ti serve con quell'oggetto.
    Detto in altro modo: non cercare di "girare" la cosa al contrario con un'attesa come stavi facendo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it L'avatar di Pierock
    Registrato dal
    Dec 2008
    Messaggi
    102
    si, la soluzione ideale sarebbe quella...
    la cosa che mi porta a fare queste giravolte è che ..
    l'oggetto che voglio creare, considerando una logica di business, ha senso che sia la classe ClassInside a crearlo;
    e tale oggetto rappresenta il dato iniziale su cui bisogna fare delle operazioni che, sempre per logica di business, sono di competenza della classe Contenitore...
    ... i miei problemi nascono proprio in virtù di voler tener queste ultime ben distinte...

    poi, se vogliamo essere onesti.. l'oggetto che mi serve ... penso che si possa serenamente creare anche con un MouseListener implementato in Contenitore...
    ... solo mi sembrava un po' ridondante (o sbagliato) creare un altro listener (in Contenitore) per far qualcosa per la quale ne esisteva già uno predisposto (ClassInside) .. agirebbero effettivamente sulla stessa cosa...

    da li il mio timore....

  4. #4
    Utente di HTML.it L'avatar di Pierock
    Registrato dal
    Dec 2008
    Messaggi
    102
    la buttlo li... un metodo static?
    e una soluzione tipo.....

    codice:
    
    public class Contenitore {
    
    
    	ClassInside inside;
    	// altro...
    
    
    	
    	private void attivaList(){
    		this.inside.attiva();
    	}
    	
    	public void esegui(){
    		this.attivaList();
    		//Object = inside.getObj();
    		// errore... l'ogetto è nullo
    		// 
    		
    	}
    	
    	public static void faiQuelCheDevi(Object obj){
    		// do it!
    	}
    	
    	
    
    
    }
    
    
    public class ClassInside implements MouseListener {
    
    
    	// altro...
    	private Object Oggetto = null;
    	private boolean flag = false;
    	private boolean fatto = false;
    	
    	
    	public void attiva(){
    		this.flag = true;
    	}
    	
    	public boolean isCreated(){
    		
    	}
    	
    	public Object getObj(){
    		return Oggetto;
    	}
    	
    	@Override
    	public void mouseClicked(MouseEvent arg0) {
    		
    		// atro codice.... necessario per la classe
    		
    		if(this.flag){
    			Oggetto = creaOggetto(); 
    			this.flag = false;
    			Contenitore.faiQuelCheDevi(Oggetto);
    			this.fatto = true;
    		}
    	}
    
    
    }

    ... ti confesso però che queste soluzioni mi lasciano sempre molti dubbi sul fatto che sia o meno una scelta saggia...
    dimmi la tua.

  5. #5
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Pierock Visualizza il messaggio
    la buttlo li... un metodo static?
    ... ti confesso però che queste soluzioni mi lasciano sempre molti dubbi sul fatto che sia o meno una scelta saggia...
    dimmi la tua.
    No, infatti come forse stavi intuendo, metodi statici così disposti sono un pessimo "design". Le due classi sono fortemente "legate" insieme, oltre al fatto che in faiQuelCheDevi, essendo static, non hai un "contesto" (ovvero l'oggetto) per operare su un Contenitore e anche se tecnicamente potresti passarglielo tramite parametro facendo qualche "giro" di passaggi in più .... sarebbe ancora peggio.
    Queste cose si risolvono seguendo i principi della programmazione ad oggetti!

    Chiarisci(mi) prima alcune cose: il MouseListener su quale/i, quanti componente/i lo registri? La creazione dell'oggetto differisce eventualmente in base a qualcosa? E se sì che cosa?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  6. #6
    Utente di HTML.it L'avatar di Pierock
    Registrato dal
    Dec 2008
    Messaggi
    102
    Chiarisci(mi) prima alcune cose: il MouseListener su quale/i, quanti componente/i lo registri?
    la classe ClassInside contiene una immagine ... ed il listener è registrato su di essa... del tipo, banalmente, clicchi e restituisce coordinate e valore

    Necessito tuttavia di un metodo nella classe contenitore che effettui delle operazioni strettamente del dominio di Compositore che inizio a partire da un punto dell'immagine scelto dall'utente...
    La creazione dell'oggetto differisce eventualmente in base a qualcosa? E se sì che cosa?
    no, per la creazione dell'oggetto non è assolutamente discriminante la classe che lo genera ...
    ma dato che l'oggetto in questione è da associare all'immagine... preferivo crearlo li (classInside) e recuperarlo in Contenitore...

    demandando tutto a Contenitore .. bisognerebbe semplicemente creare un piccolissimo listener quasi del tutto identico a quello già presente in InsideClass ... che però agisca su InsideClass.getImage() ...

  7. #7
    Utente di HTML.it L'avatar di Pierock
    Registrato dal
    Dec 2008
    Messaggi
    102
    che però agisca su InsideClass.getImage()
    intendevo ...

    "che però agisca (considerando il codice di esempio ... su inside.getImage( )"

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.