Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [Java] Passaggio valori classe interna

    Salve a tutti,

    Posto anche qui il mio "problema"

    Questo è il mio codice:
    codice:
    public void Setta(int i, int j)
    	{
    		class Colore implements ActionListener
    		   {
    			private int n=0;
    			public void actionPerformed(ActionEvent event)
    			{
    				if (n==0||n==3)
    					{
    					a[i][j].setBackground(Color.green);
    					n=0;
    					}
    				else if (n==1)
    					a[i][j].setBackground(Color.orange);
    				else if (n==2)
    					a[i][j].setBackground(Color.red);
    				n++;
    			}
    		   }
    		 ActionListener listener = new Colore();
    		 a[i][j].addActionListener(listener);
    	}
    a[i][j] è una matrice di JButton che voglio colorare quando ci clicco sopra
    Se clicco 0 volta o più di 2 volte, il pulsante deve ridiventare verde altrimenti arancione per 1 click e rosso per 2 click.

    Problema:
    non riesco a richiamare setBackground sul pulsante indicato da i e j perchè ovviamente li passo al metodo e non alla classe interna.

    Come posso risolvere?
    O se magari mi potete descrivere una soluzione alternativa.

    Forse è di una semplicità assurda, ma non ci arrivo.
    Grazie x l'aiuto ^^

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Passaggio valori classe interna

    Originariamente inviato da Raziel86
    Problema:
    non riesco a richiamare setBackground sul pulsante indicato da i e j perchè ovviamente li passo al metodo e non alla classe interna.

    Come posso risolvere?
    Solo una premessa: il Setta lo invochi solo 1 volta per ognuno dei JButton ai soli fini di inizializzazione? Se così, ok.

    Tecnicamente i due parametri di Setta così come sono non sono usabili dalla inner class perché quest'ultima può "vivere" (e nel tuo caso è così) anche dopo che Setta è terminato. Quindi innanzitutto devi mettere quei parametri come "final".

    public void Setta(final int i, final int j)

    Così diventano delle "costanti" e il loro valore essendo per così dire congelato, permette alla inner classi di usarli.

    P.S. Nota una cosa: quella che hai fatto è una "method local" inner class. È un tipo di inner class tipicamente molto poco usato, cioè .... è una cosa un po' inusuale. Puoi farlo anche come "anonymous" inner class:

    codice:
    a[i][j].addActionListener(new ActionListener() {
        ........
    });
    Che è anche più compatto.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Intanto grazie x la risposta molto celere.

    Invoco Setta solo per settare il colore di un determinato pulsante quando cliccato e basta.

    Per la "method class": Ok compatterò

    Per quanto riguarda le variabili final... si, avevo letto che le inner class utilizzano solo costanti, ma se appunto sono costanti, poi come fanno a variare?


    Non ho ancora testato la soluzione proposta quindi chiedo senza averla testata.

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Raziel86
    Invoco Setta solo per settare il colore di un determinato pulsante quando cliccato e basta.
    No alt, un attimo. Se invochi Setta su un pulsante X quando il pulsante X viene cliccato ... allora vuol dire che c'è già un listener sul pulsante .... è allora perché dovresti registrare un nuovo listener?

    Setta, per come l'hai fatto, ha senso invocarlo solo 1 volta su ogni pulsante e solo durante la inizializzazione della tua interfaccia (prima che chiunque faccia dei click).

    Originariamente inviato da Raziel86
    Per quanto riguarda le variabili final... si, avevo letto che le inner class utilizzano solo costanti, ma se appunto sono costanti, poi come fanno a variare?
    Non deve variare un bel nulla .... Setta serve solo per registrare un listener sul pulsante [i ][j] e in questo caso il listener (che è un oggetto!) si "tiene dentro" semplicemente i e j.
    Invochi Setta(3, 4) ? Bene, viene istanziato un listener che si tiene dentro i=3 e j=4 e ogni volta che clicchi, in actionPerformed hai proprio i=3 e j=4. Ma solo per quel certo pulsante a [3][4], è ovvio. Ogni pulsante ha il suo listener e ciascun listener si tiene le "coordinate" per quel pulsante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Originariamente inviato da andbin
    No alt, un attimo. Se invochi Setta su un pulsante X quando il pulsante X viene cliccato ... allora vuol dire che c'è già un listener sul pulsante .... è allora perché dovresti registrare un nuovo listener?
    Forse mi sono espresso male perchè no, non registro un altro listener. L'unico listener associato ai vari button è quello che ho postato.

    Non deve variare un bel nulla .... Setta serve solo per registrare un listener sul pulsante [i ][j] e in questo caso il listener (che è un oggetto!) si "tiene dentro" semplicemente i e j.
    Infatti com'è giusto che sia funziona.
    Avevo ragione nel dire che era una stupidaggine, ma avendo interpretato male il concetto di final, mi sono ritrovato ingarbugliato.

    Grazie per l'aiuto andbin

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.