Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135

    Gestione eventi bottoni GUI

    Salve a tutti!
    Ho un problema su un'interfaccia grafica che ho creato:
    ho realizzato dei pulsanti (sono delle immagini .gif che ho caricato),e ad ognuno di essi ho associato un evento.
    Poi volevo creare una sottoclasse generale da cui gestire tutti i pulsanti. in un libro ho trovato questo consiglio:
    codice:
    public void actionPerformed(ActionEvent e) {
        Object src = e.getSource();
        if (src == okButton) {
            // do something
        }
    }
    sembrava abbastanza buona come soluzione, ma il compilatore mi segnala un'errore:
    cannot find symbol - variable closeButton
    Il codice su cui sto lavorando è il seguente:
    codice:
     private class Gestore implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
                {   
                Object src = e.getSource();
                              
                if ( src == closeButton.getSource() ) 
                    {    
                     //n è il valore di ritorno del pulsante che viene premuto nella finestra di dialogo: 0 = "SI", 1 = "NO"
                     int n= JOptionPane.showConfirmDialog(null,"Sei sicuro di volere uscire dal gioco?", "EXIT", JOptionPane.YES_NO_OPTION);          
                     if(n==0)
                        System.exit(0);                         
                    }
                else
                 if(src == start.getSource() )
                    {
                    frameOwner.setVisible(false);         
                    Game inizio = new Game();
                    }
        
                }
        }
    Non riesco a capire come mai, potete darmi una mano?
    Linux Slackware 11 - Kernel 2.6.18

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Semplice: closeButton non è dichiarata da nessuna parte e, a quanto pare, non è nemmeno il nome di una classe.
    Se closeButton è un oggetto di una qualche classe, istanziato nella classe che contiene i pulsanti, allora devi passare un riferimento a questo oggetto alla classe Gestore (nel costruttore, ad esempio).


    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 L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Originariamente inviato da LeleFT
    Semplice: closeButton non è dichiarata da nessuna parte e, a quanto pare, non è nemmeno il nome di una classe.
    Se closeButton è un oggetto di una qualche classe, istanziato nella classe che contiene i pulsanti, allora devi passare un riferimento a questo oggetto alla classe Gestore (nel costruttore, ad esempio).
    close button è un bottone dichiarato all'interno di un pannello di una finestra. Ho postato solo la parte di codice che mi da problemi; Mi funziona tutto dell'interfaccia, a parte la gestione degli eventi di quando clicco un pulsante. Volevo implementarla in quel modo per gestire tutti i pulsanti in quella sottoclasse
    Linux Slackware 11 - Kernel 2.6.18

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    E la parte di codice che hai postato è anch'essa all'interno del pannello o al di fuori? Il messaggio del compilatore è chiaro: non riesce a vedere la variabile closeButton, che evidentemente ha uno scope diverso da quello del metodo che hai postato.

    Se la variabile non è nella stessa classe, gli unici modi che hai per poterla riferire sono due:

    1) Dichiararla public (sconsigliabile)
    2) Prevedere un metodo per accedere alla variabile (decisamente migliore)


    Poi attenzione:se closeButton è il pulsante, allora il problema potrebbe essere dato da quel metodo getSource() che non esiste per i pulsanti.


    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 L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Ecco, ho corretto il codice:
    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    import javax.swing.event.*;
    /*
     * Questa classe genera una finestra con un immagine di sfondo.
     */
    public class GUI extends Window {
        private JRadioButton closeButton;
        private JButton start;
        /* Larghezza della finestra (della foto di sfondo)*/
        public static final int WIDTH  = 629;
        /* Altezza della finestra (della foto di sfondo)*/
        public static final int HEIGHT = 475;
        /* Frame associato alla finestra */
        protected static JFrame frameOwner = new JFrame("Carlo e Marco");
        /* Ascoltatore per i movimenti del mouse */
        private static MouseMotion mouseMotion;
        /* Verifica della mobilità della finestra */
        private static boolean moveable = true;
        /* Istanza di questa classe */
        public static GUI menù;
        /*Dimensioni icone pulsante menù*/
        private static final int ALTEZZA_PULSANTE = 35;
        private static final int LARGHEZZA_PULSANTE = 150;
        /*posizione icone pulsanti menù*/
        private int yPulsante = 160;
        private final int X_PULSANTE = 40;
        private final int DISTANZA_PULSANTE = 10;
        /*
         * Punto di accesso del programma, da qua avviamo l'interfaccia grafica.
         */
        public static void main(String argv[]) {
            GUI gui = new GUI();
        }
        /*
         * Costruttore Standard (contiene tutte le istruzioni per creare i   componenti grafici).
         */
        public GUI() {
            super(frameOwner);
            //Diamo una dimensione alla nostra finestra e posizioniamola al centro dello schermo:
            //WIDTH ed HEIGHT sono due costanti che definiscono larghezza e altezza
            Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
            setBounds((screenSize.width-WIDTH)/2,(screenSize.height-HEIGHT)/2,WIDTH,HEIGHT);
            ImageIcon icon = new ImageIcon("background.png"); //Carichiamo la nostra immagine di sfondo
            JLabel background = new JLabel(icon);
            background.setSize(background.getPreferredSize());
            /* Inseriamo la nostra immagine come se fosse uno sfondo; gli elementi aggiunti manm mano vengono collocati uno sopra l'altro.
               L'immagine è visualizzata tramite un semplice componente JLabel aggiunto poi al JLayeredPane, unico pannello che risiede nella
               window */
            JLayeredPane layer = new JLayeredPane();
            layer.setPreferredSize(background.getPreferredSize());
            layer.add(background, JLayeredPane.DEFAULT_LAYER);
            setLayout(new BorderLayout());
            add("Center", layer);
            JLabel title = new JLabel("PROVA A USCIRE DAL LABIRINTO!",new ImageIcon("icon.png"),SwingConstants.LEFT);
            title.setBounds(30,10,400,64);
            title.setFont(new Font(title.getFont().getName(),Font.BOLD,20));
            //Ogni altro elemento grafico deve essere aggiunto alla finestra non passando per il metodo add(), bensì per il  layer seguente:
            layer.add(title, JLayeredPane.PALETTE_LAYER);
            //Pulsante di chiusura: collocazione sul pannello e attribuzione del compito di chiusura della finestra.
            closeButton  = new JRadioButton(new ImageIcon("close.png"));
            closeButton.setBounds(570,18,40,37);
            closeButton.setFocusable(false);
            closeButton.setBorderPainted(true);
            closeButton.setOpaque(false);
    
             //Crea un'istanza della classe interna Gestore per la gestione dell'uscita dal gioco
            Gestore gestore = new Gestore();
            closeButton.addActionListener(gestore);
            layer.add(closeButton, JLayeredPane.PALETTE_LAYER);
    
    start = new JButton(new ImageIcon("start.jpg"));
       start.setBounds(X_PULSANTE,yPulsante,LARGHEZZA_PULSANTE,ALTEZZA_PULSANTE);
            start.setFocusable(false);
            start.setBorderPainted(true);
            start.setOpaque(false);
            start.addActionListener(gestore);
            layer.add(start, JLayeredPane.PALETTE_LAYER);
            mouseMotion = new MouseMotion();
            addMouseMotionListener(mouseMotion);
            addMouseListener(new MouseAdapter() {
                public void mouseReleased(MouseEvent me) {
                    if (!moveable) return;
                    mouseMotion.clearPosition();
                }
                public void mousePressed(MouseEvent me) {
                    if (!moveable) return;
                }
            });
            setVisible(true);
        }
    
        /*
         * Ascoltatore per rilevare i movimenti del mouse e consentire
         * lo spostamento esatto della finestra (gestisce il trascinamento col mouse).
         */
        public class MouseMotion implements MouseMotionListener {
            int oldx = -10;
            int oldy = -10;
            public void mouseDragged(MouseEvent me) {
                if (!moveable) return;
                if ((oldx == -10) && (oldy == -10)) {
                    oldx = me.getX();
                    oldy = me.getY();
                    return;
                }
                if (me.getID() == MouseEvent.MOUSE_RELEASED) {
                    System.out.println("x: " + me.getX() + " y: " + me.getY());
                }
                setLocation(getLocation().x - (oldx - me.getX()), getLocation().y - (oldy - me.getY()));
            }
            public void mouseMoved(MouseEvent me) {}
            public void clearPosition() {
                oldx = -10;
                oldy = -10;
            }
        }
        /*Classe interna per la gestione dell'uscita dal gioco*/
        private class Gestore implements ActionListener
        {
            public void actionPerformed(ActionEvent e)
                {
                 Object src = e.getSource();
                if ( src.equals(closeButton)  )
                    {
                     //n è il valore di ritorno del pulsante che viene premuto nella finestra di dialogo: 0 = "SI", 1 = "NO"
                     int n= JOptionPane.showConfirmDialog(null,"Sei sicuro di volere uscire dal gioco?", "EXIT", JOptionPane.YES_NO_OPTION);
                     if(n==0)
                        System.exit(0);
                    }
                else
                    if( src.equals(start) )
                    {
                    frameOwner.setVisible(false);
                      Game inizio = new Game();
                    }
                }
        }
    }
    Si, era proprio un problema di scope dei dati, non avevo dichiarato esternamente i pulsanti closeButton e start, per cui non riusciva a riconoscerli all'interno dei metodi e tantomeno ad assegnargli eventi.
    Grazie per l'aiuto, a buon rendere!
    carlo
    Linux Slackware 11 - Kernel 2.6.18

  6. #6
    Utente di HTML.it L'avatar di morphy79
    Registrato dal
    Jun 2004
    Messaggi
    1,568
    Originariamente inviato da LeleFT

    1) Dichiararla public (sconsigliabile)
    perchè sconsigliabile ???
    io sto giochetto lo uso... una variabile pubbica è fatto apposta per esser visto dalle altre classi... che male c'è ???
    odio chi parla di politica..
    anzi vorrei fondare un partito contro tutto ciò

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Originariamente inviato da morphy79
    perchè sconsigliabile ???
    io sto giochetto lo uso... una variabile pubbica è fatto apposta per esser visto dalle altre classi... che male c'è ???
    C'è di male che non si rispetta appieno l'incapsulamento (regola numero 1 della programmazione orientata agli oggetti, che permette a ciascun oggetto di essere manipolato "consapevolmente"). Permettendo pubblico accesso ai membri della classe si perde tutto quello che la programmazione orientata agli oggetti dovrebbe garantire; se si mettono a disposizione dei metodi pubblici, invece, si garantisce il funzionamento dell'oggetto in se. Si garantisce, quindi, che tutti i controlli di consistenza della classe non vengano a mancare.
    In particolare, se si permette l'accesso diretto ai membri della classe da parte dell'esterno, si permette a qualsiasi classe di manipolare (anche in modo non corretto) le fondamenta su cui si erge la classe stessa e non è più garantibile che la classe sia coerente.


    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 L'avatar di caralu
    Registrato dal
    Sep 2004
    Messaggi
    135
    Ciao! Mi serve un'ultimo aiuto!!
    Ho corretto tutto e adesso mi funziona QUASI perfettamente la gestione dei bottoni, a parte che ne dovrei creare altri due che implementano dei listeners che generano certi eventi (al click di uno qualsiasi di questi 2 bottoni si dovrebbe chiudere la finestra principale e se ne dovrebbe aprire un'altra della stessa dimensione, sullo stesso punto di quella principale. Chidendo poi quest'ultima finestra creata si dovrebbe riaprire la finestra principale).
    Ho provato a implementare tutto ciò sfruttando un po di codice della finestra principale (il codice che ho postato sopra), ma non riesco a chiudere la principale e fare aprire la nuova. Potete darmi qualche consiglio?
    Linux Slackware 11 - Kernel 2.6.18

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.