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

    Domanda su MouseListener

    Buongiorno a tutti, io, sto facendo un progetto di un giochino per scuola, sono alle prime armi e ho riscontrato un problema che spero di risolvere con i vostri consigli.
    Ho creato una classe contenente un frame con diversi bottoni etc.
    Su questo frame devo poter stampare una lista di pannelli, creata in runtime, non statica. Per creare la lista di pannelli ho utilizzato questo metodo nella mia classe
    codice:
    public void CreaLista(){
        pannelli = new ArrayList<JPanel>();
        for (int i = 0; i < 8; i++) {
               pannelli.add(new JPanel());
              pannelli.get(i).setBackground(Color.BLACK);
        }
    }
    successivamente li ho stampati nel frame tramite un GridLayout. Fino a qui tutto bene, tutto funziona.
    Ora però ho bisogno che questi pannelli, durante la pressione del mouse cambino colore e che quando la pressione del mouse termina ritornino del colore originale. Ho visto che tra gli event handler di un Panel è presente MousePressed e MouseRelased. Ho provato a implementare questi due metodi su un pannello solo e sono riuscito a fargli cambiare colore alla pressione
    codice:
            JPanel panel = new JPanel();
            panel.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    panel.setBackground(Color.RED);
                }
                @Override
                public void mouseReleased(MouseEvent e) {
                    panel.setBackground(Color.YELLOW);
                }
            });
            panel.setBounds(107, 52, 80, 71);
            frame.add(panel);
    il problema è che non riesco nella maniera più assoluta ad applicare questi due metodi a ogni singolo pannello contenuto nell'ArrayList. Qualcuno sa aiutarmi? Grazie mille in anticipo

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da mike1991 Visualizza il messaggio
    codice:
            JPanel panel = new JPanel();
            panel.addMouseListener(new MouseAdapter() {
                @Override
                public void mousePressed(MouseEvent e) {
                    panel.setBackground(Color.RED);
                }
                @Override
                public void mouseReleased(MouseEvent e) {
                    panel.setBackground(Color.YELLOW);
                }
            });
            panel.setBounds(107, 52, 80, 71);
            frame.add(panel);
    il problema è che non riesco nella maniera più assoluta ad applicare questi due metodi a ogni singolo pannello contenuto nell'ArrayList. Qualcuno sa aiutarmi? Grazie mille in anticipo
    Se questo codice che ho quotato lo metti (o l'hai già messo) nel for che si vede prima (quel for (int i = 0; i < 8; i++)), non ci sono problemi.
    Perché ad ogni ciclo hai un nuovo JPanel e ciascuno ha agganciato la sua implementazione del MouseListener, che fa riferimento al panel relativo poiché quel "panel" nei due metodi si riferisce alla variabile JPanel che hai definito prima del addMouseListener, appunto che è distinta per ciascun ciclo.

    E questo tra l'altro vuol dire che stai usando Java 8, perché in questa release le anonymous inner-class possono fare riferimento alle variabili locali del metodo anche se non sono fisicamente marcate final, purché siano "effectively final".


    P.S. in generale non postare mai codice "colorato", è un casino quotarlo per intero o peggio parzialmente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Se questo codice che ho quotato lo metti (o l'hai già messo) nel for che si vede prima (quel for (int i = 0; i < 8; i++))
    ciao avevo già provato a fare cosi e purtroppo non sono riuscito a farlo funzionare perché mi da un errore riguardante qualcosa che tu hai accennato sotto. Facendo cosi
    codice:
    public void AggiungiPannelli(){
        for (int i = 0; i < 8; i++) {
            pannelli.add(new JPanel());
            pannelli.get(i).setBackground(Color.BLACK);
            pannelli.get(i).addMouseListener(new MouseAdapter() {
            @Override
             public void mousePressed(MouseEvent e) {
                   pannelli.get(i).setBackground(Color.RED);
             }
            @Override
             public void mouseReleased(MouseEvent e) {
                   pannelli.get(i).setBackground(Color.BLACK);
             }
        });
    }
    dentro nei due metodi mousePressed e Relased quando faccio la get per aggiornare il colore di background mi da errore sulla i dicendo "Local variable i defined in an enclosing scope must be final or effectively
    final".
    Ho provato a dichiarare la i come final globale ma non cambia nulla. E se metto la i come final all'interno del metodo nel ciclo poi non me la fa più incrementare perché mi dice che la variabile finale i non può essere assegnata. Sono bloccato a questo.
    Grazie mille davvero per l'aiuto che mi stai dando.

    ps mi scuso per i colori ma pur incollando senza formattazione il codice poi quando lo pubblico i colori rimangono...
    Ultima modifica di mike1991; 21-08-2016 a 11:43

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da mike1991 Visualizza il messaggio
    ciao avevo già provato a fare cosi e purtroppo non sono riuscito a farlo funzionare perché mi da un errore riguardante qualcosa che tu hai accennato sotto. Facendo cosi
    codice:
    public void AggiungiPannelli(){
        for (int i = 0; i < 8; i++) {
            pannelli.add(new JPanel());
            pannelli.get(i).setBackground(Color.BLACK);
            pannelli.get(i).addMouseListener(new MouseAdapter() {
            @Override
             public void mousePressed(MouseEvent e) {
                   pannelli.get(i).setBackground(Color.RED);
             }
            @Override
             public void mouseReleased(MouseEvent e) {
                   pannelli.get(i).setBackground(Color.BLACK);
             }
        });
    }
    No, perché qui il problema è il riferimento alla variabile 'i'.

    Più semplicemente (e più pulito):

    codice:
    for (int i = 0; i < 8; i++) {
        JPanel panel = new JPanel();
        // altri setup su panel
        
        panel.addMouseListener(new MouseAdapter() {
            // i metodi qui POSSONO fare riferimento a panel, che è quel JPanel distinto per ciascun ciclo
        });
    
        // .. altro (aggiungi panel dove vuoi)
    }

    Da Java 8 panel può non essere final, prima di Java 8 DEVE essere final.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, perché qui il problema è il riferimento alla variabile 'i'.

    Più semplicemente (e più pulito):

    codice:
    for (int i = 0; i < 8; i++) {
        JPanel panel = new JPanel();
        // altri setup su panel
        
        panel.addMouseListener(new MouseAdapter() {
            // i metodi qui POSSONO fare riferimento a panel, che è quel JPanel distinto per ciascun ciclo
        });
    
        // .. altro (aggiungi panel dove vuoi)
    }

    Da Java 8 panel può non essere final, prima di Java 8 DEVE essere final.
    e ma facendo cosi creo una serie di pannelli che non sono nell'ArrayList di pannelli. Io ho bisogno che siano in una lista perché una volta creati ho bisogno di poterli spostare etc. Tramite un ArrayList non si può fare?

  6. #6
    Quote Originariamente inviata da andbin Visualizza il messaggio
    No, perché qui il problema è il riferimento alla variabile 'i'.

    Più semplicemente (e più pulito):

    codice:
    for (int i = 0; i < 8; i++) {
        JPanel panel = new JPanel();
        // altri setup su panel
        
        panel.addMouseListener(new MouseAdapter() {
            // i metodi qui POSSONO fare riferimento a panel, che è quel JPanel distinto per ciascun ciclo
        });
    
        // .. altro (aggiungi panel dove vuoi)
    }

    Da Java 8 panel può non essere final, prima di Java 8 DEVE essere final.
    Ho provato cosi
    codice:
                public void AggiungiPannelli(){
            for (int i = 0; i < 8; i++) {
                JPanel panel = new JPanel();
                panel.setBackground(Color.BLACK);
                panel.addMouseListener(new MouseAdapter() {
    @Override
                    public void mousePressed(MouseEvent e) {
                        panel.setBackground(Color.RED);
                    }
    @Override
                    public void mouseReleased(MouseEvent e) {
                        panel.setBackground(Color.BLACK);
                    }
                });
                pannelli.get(i).add(panel);
            }
    in questo modo non mi da righe con errori quando lo avvio, ma poi non parte più non si apre nemmeno il frame e la console mi dice:

    java.lang.IndexOutOfBoundsException: Index: 0, Size: 0
    at java.util.ArrayList.rangeCheck(ArrayList.java:653)
    at java.util.ArrayList.get(ArrayList.java:429)
    at showgame.Playground.AggiungiPannelli(Playground.java:443)
    at showgame.Playground.DisegnaPiramideIniziale(Playground.java:421)
    at showgame.Playground.initialize(Playground.java:814)
    at showgame.Playground.<init>(Playground.java:78)
    at showgame.Playground$1.run(Playground.java:68)
    at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:311)
    at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:756)
    at java.awt.EventQueue.access$500(EventQueue.java:97)
    at java.awt.EventQueue$3.run(EventQueue.java:709)
    at java.awt.EventQueue$3.run(EventQueue.java:703)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.security.ProtectionDomain$JavaSecurityAccessI mpl.doIntersectionPrivilege(ProtectionDomain.java:76)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:726)
    at java.awt.EventDispatchThread.pumpOneEventForFilter s(EventDispatchThread.java:201)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
    at java.awt.EventDispatchThread.pumpEventsForHierarch y(EventDispatchThread.java:105)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

  7. #7
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da mike1991 Visualizza il messaggio
    codice:
                pannelli.get(i).add(panel);
    Semplicemente

    pannelli.add(panel);


    P.S. Per cortesia NON postare codice "colorato"! Copialo prima in Notepad/Notepad++/ecc.. poi da lì lo ricopi e solo dopo lo incolli qui sul forum.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  8. #8
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Semplicemente

    pannelli.add(panel);


    P.S. Per cortesia NON postare codice "colorato"! Copialo prima in Notepad/Notepad++/ecc.. poi da lì lo ricopi e solo dopo lo incolli qui sul forum.
    Hai ragione funziona cosi, che stupido sono stato... grazie mille veramente...

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.