Passare parametri in una classe innestata anonima

di il
2 risposte

Passare parametri in una classe innestata anonima

Salve, sono nuovo nel forum(primo post)
Avrei un problemino con una matrice di pulsanti. Ho creato una matrice con 2 cicli for. dopo ciò vorrei mettere dei listener con altri due cicli for. E fino a qui, ok. Ora però non posso riesco a far passare i pulsanti nella firma della classe anonima innestata.

vi posto il codice che forse è meglio.
private void jMenuItem8ActionPerformed(java.awt.event.ActionEvent evt) {                                           
        ifBottoni.setVisible(true);//internal j frame visibile
        jPanelBottoni.setVisible(false); 
        
        jPanelBottoni.setLayout(new GridLayout(x,y));//la matrice di pulsanti in una griglia
        for(int i=0;i<x;i++){//primo ciclo per istanziare la matrice di pulsanti
            for(int j=0;j<y;j++){
                    c[i][j]= new Casella();
                    c[i][j].setBackground(Color.CYAN);
                    //c[i][j].setSize(100, 100);
                    jPanelBottoni.add(c[i][j]);                    
                    c[i][j].setVisible(true);
            }
        }
        for( int i=0;i<x;i++){//secondo ciclo per mettere i listener
            for(int j=0;j<y;j++){
                    c[i][j].addActionListener(new ActionListener() {

                        @Override
                        public void actionPerformed(ActionEvent e) {
                           //cambia il colore della casella cliccata
                           c[i][j].setBackground(Color.black);
                           
                           //cambia il colore delle caselle adiacenti
                           c[-1][-1].setBackground(Color.red);
                           c[i-1][j-1].setBackground(Color.red);
                           c[i][j-1].setBackground(Color.red);
                           c[i+1][j-1].setBackground(Color.red);
                           c[i-1][j].setBackground(Color.red);
                           c[i+1][j].setBackground(Color.red);
                           c[i-1][j+1].setBackground(Color.red);
                           c[i][j+1].setBackground(Color.red);
                           c[i+1][j+1].setBackground(Color.red);
                           
                            
                        }
                    });
            }
        }
        jPanelBottoni.setVisible(true);
    }

2 Risposte

  • Re: Passare parametri in una classe innestata anonima

    federaimondi ha scritto:


    Ora però non posso riesco a far passare i pulsanti nella firma della classe anonima innestata.
    Se la variabile c è "di istanza", allora è accessibile da quella anonymous inner class.
    Non sono accessibili i e j perché non sono final (non potrebbero esserlo poiché indici di un for) e non sono nemmeno "effectively final" (Java 8+) poiché appunto sono comunque modificati dal for.

    La soluzione è banale: 2 variabili temporanee.
    for (int i=0; i<x; i++) {
        for (int j=0; j<y; j++) {
            int iAction = i;
            int jAction = j;
    
            ....... new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    // QUI PUOI usare iAction / jAction
                }
            }
    Se sei >= Java8, iAction/jAction possono stare così senza altro. Se sei <= Java7, allora VANNO messe come final


    P.S. Non è comunque un buon approccio per gestire caselle adiacenti.
  • Re: Passare parametri in una classe innestata anonima

    Andbin, un grazie enorme. Infatti, come hai detto tu era una banalità. Purtroppo non ci avevo pensato.
    Vado a colorare i miei pulsanti.
    A buon rendere.
Devi accedere o registrarti per scrivere nel forum
2 risposte