Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 15
  1. #1

    [JAVA] Altri problemi con JButton e ActionListener

    Ciao a tutti!

    Capperi, non ci capisco più niente!

    Devo far chiudere un frame tramite la pressione del tasto "Annulla", ho provato ad usare dispose() e setVisible(false), ma il compiler mi da errore, inoltre mi da errore anche nei ricevitori di evento, voi ci capite qualcosa?
    Posto il codice e poi l'errore:
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Screen {
        public final static boolean RIGHT_TO_LEFT = false;
    
        public static void addComponentsToPane(Container contentPane) {
            if (RIGHT_TO_LEFT) {
                contentPane.setComponentOrientation(
                    ComponentOrientation.RIGHT_TO_LEFT);
            }
    	//Due colonne e dodici righe:
            contentPane.setLayout(new GridLayout(12,2));
    
            contentPane.add(new JLabel("Nome:"));
            contentPane.add(new JTextField("Inserisci il nome."));
            contentPane.add(new JLabel("Cognome:"));
            contentPane.add(new JTextField("Inserisci il cognome."));
            contentPane.add(new JLabel("Indirizzo:"));
            contentPane.add(new JTextField("Inserisci l'indirizzo."));
            contentPane.add(new JLabel("Ruolo:"));
            contentPane.add(new JTextField("Inserisci il ruolo."));
            contentPane.add(new JLabel("Matricola:"));
            contentPane.add(new JTextField("Inserisci la matricola."));
            contentPane.add(new JLabel("Paga base:"));
            contentPane.add(new JTextField("Inserisci la paga base."));
            contentPane.add(new JLabel("Paga oraria:"));
            contentPane.add(new JTextField("Inserisci la paga oraria attuale."));
            contentPane.add(new JLabel("Ore giornaliere:"));
            contentPane.add(new JTextField("Inserisci le ore giornaliere lavorative."));
            contentPane.add(new JLabel("Sede:"));
            contentPane.add(new JTextField("Inserisci la sede dell'ufficio."));
            contentPane.add(new JLabel("Numero dipendenti:"));
            contentPane.add(new JTextField("Inserisci il numero dei dipendenti dell'ufficio."));
            contentPane.add(new JLabel("Modifica dipendente:"));
    	   Choice theoptions = new Choice();
    	   theoptions.addItem("Aggiungi dipendente");
    	   theoptions.addItem("Aggiorna dipendente");
    	   theoptions.addItem("Annulla dipendente");
      	   contentPane.add(theoptions);
    
    //Aggiungo i JButton (con i nomi)
    	JButton fineButton = new JButton("Fine");
    	contentPane.add(fineButton);
    
    	JButton annullaButton = new JButton("Annulla");
    	contentPane.add(annullaButton);
    
    	//ActionListener(s) da implementare dopo questa classe
    	Receiver1 receiver1 = new Receiver1();
    	Receiver2 receiver2 = new Receiver2();
    
    	//	assegnazione ActionListener(s) ai corrispondenti JButton(s)   assegnazione ActionListener(s) ai corrispondenti JButton(s)
    	fineButton.addActionListener(receiver1);
    	annullaButton.addActionListener(receiver2);
        }
    
        class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    		}
    	}
    
        class Receiver2 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    			frame.setVisible(false);
    		}
    	}
    
        private static void createAndShowGUI() {
            JFrame.setDefaultLookAndFeelDecorated(true);
    
            JFrame frame = new JFrame("Screen");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Aggiungo i componenti al pannello:
            addComponentsToPane(frame.getContentPane());
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    codice:
    Screen.java:52: error: No enclosing instance of type Screen is accessible. Must qualify the allocation with an enclosing instance of type Screen (e.g. x.new A() where x is an instance of Screen).
    	Receiver1 receiver1 = new Receiver1();
    	                      ^^^^^^^^^^^^^^^
    Screen.java:53: error: No enclosing instance of type Screen is accessible. Must qualify the allocation with an enclosing instance of type Screen (e.g. x.new A() where x is an instance of Screen).
    	Receiver2 receiver2 = new Receiver2();
    	                      ^^^^^^^^^^^^^^^
    Vi ringrazio per l'attenzione!
    Gato

  2. #2
    Ok, il primo errore sono riuscito a risolverlo da solo
    codice:
        class Receiver2 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    			System.exit(0);    //al posto di setVisible(false) o dispose()
    		}
    	}
    resta il problema dei JButton...
    Gato

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da fpertegato
    resta il problema dei JButton...
    Sarebbe?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    resta il problema dei JButton...
    Il punto è che se nel actionPerformed invochi semplicemente setVisible(false) di chi sarebbe questo metodo? Pensaci ....

    Non è del tuo ReceiverX .... non è nemmeno della classe "contenitore" (Screen) perché non è un JFrame.

    All'interno del actionPerformed dovresti avere "in scope" il reference al JFrame .... non ce l'hai. Avresti potuto creare una istanza di Screen e usare delle variabili di istanza .... non l'hai fatto perché col design che hai usato Screen ha solo quei metodi statici e il JFrame lo istanzi "al volo" in createAndShowGUI().

    Dovresti cambiare "design". Fai come faccio spesso nei miei esempi minimali che posto.

    codice:
    public class TuoFrame extends JFrame {
        // eventuali variabili "di istanza", es. dei componenti
    
        public TuoFrame() {
            ....
        }
    
        // se qui metti delle "inner class" dei listener, allora il reference al JFrame è "in scope"!!!
    
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Dovresti cambiare "design". Fai come faccio spesso nei miei esempi minimali che posto.

    codice:

    public class TuoFrame extends JFrame {
    // eventuali variabili "di istanza", es. dei componenti

    public TuoFrame() {
    ....
    }

    // se qui metti delle "inner class" dei listener, allora il reference al JFrame è "in scope"!!!

    }
    OK, provo subito!

    Sarebbe?
    Screen.java:52: error: No enclosing instance of type Screen is accessible. Must qualify the allocation with an enclosing instance of type Screen (e.g. x.new A() where x is an instance of Screen).
    Receiver1 receiver1 = new Receiver1();
    ^^^^^^^^^^^^^^^
    Screen.java:53: error: No enclosing instance of type Screen is accessible. Must qualify the allocation with an enclosing instance of type Screen (e.g. x.new A() where x is an instance of Screen).
    Receiver2 receiver2 = new Receiver2();
    ^^^^^^^^^^^^^^^
    Gato

  6. #6
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da fpertegato
    Screen.java:52: error: No enclosing instance of type Screen is accessible. Must qualify the allocation with an enclosing instance of type Screen (e.g. x.new A() where x is an instance of Screen).
    Receiver1 receiver1 = new Receiver1();
    ^^^^^^^^^^^^^^^
    Screen.java:53: error: No enclosing instance of type Screen is accessible. Must qualify the allocation with an enclosing instance of type Screen (e.g. x.new A() where x is an instance of Screen).
    Receiver2 receiver2 = new Receiver2();
    ^^^^^^^^^^^^^^^
    Non mi pare un errore "coi JButton" eh
    Puoi fare due cose: o dichiari le due classi come "static" oppure passi a quel metodo un'istanza di Screen da usare per instanizare Receiver1/2 in questo modo: screenInstance.new Receiver1() (se ricordo bene)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  7. #7
    Graaaazieeee a tutti e due!
    Ho provato a fare come avete detto voi eet voilà!! Tutto funziona!!=)

    Vi posto il codice, se avete voglia di guardarlo poi mi dite se voi avreste fatto in modo diverso?
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.event.ActionListener;
    
    public class Screen3 extends JFrame {
    	private static final long serialVersionUID = 1L;
    
        public static void addComponentsToPane(Container contentPane) {
    
    	//Due colonne e dodici righe:
            contentPane.setLayout(new GridLayout(12,2));
    
            contentPane.add(new JLabel("Nome:"));
            contentPane.add(new JTextField("Inserisci il nome."));
            contentPane.add(new JLabel("Cognome:"));
            contentPane.add(new JTextField("Inserisci il cognome."));
            contentPane.add(new JLabel("Indirizzo:"));
            contentPane.add(new JTextField("Inserisci l'indirizzo."));
            contentPane.add(new JLabel("Ruolo:"));
            contentPane.add(new JTextField("Inserisci il ruolo."));
            contentPane.add(new JLabel("Matricola:"));
            contentPane.add(new JTextField("Inserisci la matricola."));
            contentPane.add(new JLabel("Paga base:"));
            contentPane.add(new JTextField("Inserisci la paga base."));
            contentPane.add(new JLabel("Paga oraria:"));
            contentPane.add(new JTextField("Inserisci la paga oraria attuale."));
            contentPane.add(new JLabel("Ore giornaliere:"));
            contentPane.add(new JTextField("Inserisci le ore giornaliere lavorative."));
            contentPane.add(new JLabel("Sede:"));
            contentPane.add(new JTextField("Inserisci la sede dell'ufficio."));
            contentPane.add(new JLabel("Numero dipendenti:"));
            contentPane.add(new JTextField("Inserisci il numero dei dipendenti dell'ufficio."));
            contentPane.add(new JLabel("Modifica dipendente:"));
    	   Choice theoptions = new Choice();
    	   theoptions.addItem("Aggiungi dipendente");
    	   theoptions.addItem("Aggiorna dipendente");
    	   theoptions.addItem("Annulla dipendente");
      	   contentPane.add(theoptions);
    
    //Aggiungo i JButton (con i nomi)
    	JButton fineButton = new JButton("Fine");
    	contentPane.add(fineButton);
    
    	JButton annullaButton = new JButton("Annulla");
    	contentPane.add(annullaButton);
    
    	//ActionListener(s) da implementare dopo questa classe
    	Receiver1 receiver1 = new Receiver1();
    	Receiver2 receiver2 = new Receiver2();
    
    	//	assegnazione ActionListener(s) ai corrispondenti JButton(s)   assegnazione ActionListener(s) ai corrispondenti JButton(s)
    	fineButton.addActionListener(receiver1);
    	annullaButton.addActionListener(receiver2);
         }
    
    
        static class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    
    		}
    	}
    
        static class Receiver2 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    			System.exit(0);
    		}
    	}
    
        private static void createAndShowGUI() {
            JFrame.setDefaultLookAndFeelDecorated(true);
    
            JFrame frame = new JFrame("Screen");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Aggiungo i componenti al pannello:
            addComponentsToPane(frame.getContentPane());
    
            frame.pack();
            frame.setVisible(true);
        }
    
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    createAndShowGUI();
                }
            });
        }
    }
    Gato

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    Vi posto il codice, se avete voglia di guardarlo poi mi dite se voi avreste fatto in modo diverso?
    No, non ci siamo .... praticamente è quasi come quello iniziale, hai solo cambiato/aggiunto qualcosa.

    Io dicevo (e lo ripeto), una cosa del tipo:

    codice:
    import java.awt.*;
    import java.awt.event.*;
    import javax.swing.*;
    .....altri eventuali import.....
    
    public class TuoFrame extends JFrame {
        .....qui tieni variabili di istanza, ad esempio riferimenti ai componenti.....
    
        public TuoFrame() {
            super("Test Frame");    // Cambia come vuoi
            setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
            setSize(300, 200);   // cambia se vuoi o ometti se fai un pack alla fine
    
            .....qui istanzi i componenti e li assegni alle variabili di istanza.....
    
            ....addActionListener(new MyListener());
        }
    
        private class MyListener implements ActionListener {
            public void actionPerformed(ActionEvent e) {
                .....qui puoi fare setVisible(false) perché sei nella istanza del JFrame!!
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new TestFrame().setVisible(true);
                }
            });
        }
    }
    Non so ..... più chiaro di così .....
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Grazie andbin per la pazienza!!!
    Ho provato a fare come dicevi tu, ma sicuramente ho fatto errori dettati anche dall'inesperienza, infatti oltre a non capire l'errore che mi da a runtime son molto confuso su ciò che ho scritto!
    Posto codice ed errore:
    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.event.ActionListener;
    
    public class Screen2 extends JFrame {
    	private static final long serialVersionUID = 1L;
    
    // Creazione dei componenti
        JButton annullaButton;
        JButton fineButton;
        JPanel pannello;
        Container contentPane;  //è giusto così?
    
    
    	public Screen2() {
    
    	  super("Screen2");
    
    	  setSize(400, 180);
    
    	  setDefaultCloseOperation(EXIT_ON_CLOSE);
    
           JFrame.setDefaultLookAndFeelDecorated(true);
    
    //.....qui istanzi i componenti e li assegni alle variabili di istanza.....
    //    Anche quì sotto non son sicuro di quello che ho scritto...tu che dici?
    
    	JLabel lNome = new JLabel("Nome:");
    		contentPane.add(lNome);
    	JTextField tNome = new JTextField("Inserisci il nome");
    		contentPane.add(tNome);
    	JLabel lCognome = new JLabel("Cognome:");
    		contentPane.add(lCognome);
    	JTextField tCognome = new JTextField("Inserisci il cognome");
    		contentPane.add(tCognome);
    	JLabel lIndirizzo = new JLabel("Indirizzo:");
    		contentPane.add(lIndirizzo);
    	JTextField tIndirizzo = new JTextField("Inserisci l'indirizzo");
    		contentPane.add(tIndirizzo);
    	JLabel lRuolo = new JLabel("Ruolo:");
    		contentPane.add(lRuolo);
    	JTextField tRuolo = new JTextField("Inserisci il ruolo");
    		contentPane.add(tRuolo);
    	JLabel lMatricola = new JLabel("Matricola:");
    		contentPane.add(lMatricola);
    	JTextField tMatricola = new JTextField("Inserisci la matricola");
    		contentPane.add(tMatricola);
    	JLabel lPagBase = new JLabel("Paga base:");
    		contentPane.add(lPagBase);
    	JTextField tPagBase = new JTextField("Inserisci la paga base");
    		contentPane.add(tPagBase);
    	JLabel lPagOraria = new JLabel("Paga oraria attuale:");
    		contentPane.add(lPagOraria);
    	JTextField tPagOraria = new JTextField("Inserisci la paga oraria attuale");
    		contentPane.add(tPagOraria);
    	JLabel lOreLavoro = new JLabel("Ore lavorative giornaliere:");
    		contentPane.add(lOreLavoro);
    	JTextField tOreLavoro = new JTextField("Inserisci le ore lavorative giornaliere");
    		contentPane.add(tOreLavoro);
    	JLabel lSede = new JLabel("Sede:");
    		contentPane.add(lSede);
    	JTextField tSede = new JTextField("Inserisci la sede dell'ufficio");
    		contentPane.add(tSede);
    	JLabel lNumDipendenti = new JLabel("Numero dipendenti:");
    		contentPane.add(lNumDipendenti);
    	JTextField tNumDipendenti = new JTextField("Inserisci il numero dei dipendenti");
    		contentPane.add(tNumDipendenti);
    	JLabel lModifica = new JLabel("Tipo di modifica:");
    		contentPane.add(lModifica);
    
    	Choice theoptions = new Choice();
    	  theoptions.addItem("Aggiungi dipendente");
    	  theoptions.addItem("Aggiorna dipendente");
    	  theoptions.addItem("Annulla dipendente");
    		contentPane.add(theoptions);
    
    //Aggiungo i JButton (con i nomi)
    	JButton fineButton = new JButton("Fine");
    		contentPane.add(fineButton);
    
    	JButton annullaButton = new JButton("Annulla");
    		contentPane.add(annullaButton);
    
    
    //   Settaggio testo
    		tNome.setEditable(true);
    		tCognome.setEditable(true);
    		tIndirizzo.setEditable(true);
    		tRuolo.setEditable(true);
    		tMatricola.setEditable(true);
    		tPagBase.setEditable(true);
    		tPagOraria.setEditable(true);
    		tOreLavoro.setEditable(true);
    		tSede.setEditable(true);
    		tNumDipendenti.setEditable(true);
    
    	//ActionListener(s) da implementare dopo questa classe
    	Receiver1 receiver1 = new Receiver1();
    	Receiver2 receiver2 = new Receiver2();
    
    	//	assegnazione ActionListener(s) ai corrispondenti JButton(s)   assegnazione ActionListener(s) ai corrispondenti JButton(s)
    
    	fineButton.addActionListener(receiver1);
    	annullaButton.addActionListener(receiver2);
    
    	}
    
    
    
        class Receiver1 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    
    		}
    	}
    
        class Receiver2 implements ActionListener {
    	public void actionPerformed(ActionEvent e) {
    
    			System.exit(0);
    		}
    	}
    
    /*    private static void createAndShowGUI() {
            JFrame.setDefaultLookAndFeelDecorated(true);
    
            JFrame frame = new JFrame("Screen");
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
            //Aggiungo i componenti al pannello:
    //        addComponentsToPane(frame.getContentPane());
    
    //        frame.pack();
            frame.setVisible(true);
        }
    */
        public static void main(String[] args) {
            javax.swing.SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new Screen2().setVisible(true);
                }
            });
        }
    }
    codice:
    jekotojava@jekotojava-exDemo:~/Scrivania/Super/Screen$ java Screen2
    Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    	at Screen2.<init>(Screen2.java:30)
    	at Screen2$1.run(Screen2.java:140)
    	at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:226)
    	at java.awt.EventQueue.dispatchEvent(EventQueue.java:602)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:275)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:200)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:185)
    	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:177)
    	at java.awt.EventDispatchThread.run(EventDispatchThread.java:138)
    Secondo te che Orrori ho fatto? Riscriverlo mi ha mandato un po' in confusione...
    Gato

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da fpertegato
    Grazie andbin per la pazienza!!!
    Di niente ... anche se non leggi i miei messaggi privati va bene lo stesso ... aiuto sempre volentieri.

    Originariamente inviato da fpertegato
    codice:
    public class Screen2 extends JFrame {
    
    // Creazione dei componenti
        JButton annullaButton;
        JButton fineButton;
        JPanel pannello;
        Container contentPane;  //è giusto così?  // Sì è giusto ma devi inizializzarlo!!
    
    
    	public Screen2() {
    
    	  super("Screen2");
    
    	  setSize(400, 180);
    
    	  setDefaultCloseOperation(EXIT_ON_CLOSE);
              contentPane = getContentPane();     // <----- Così
    
           JFrame.setDefaultLookAndFeelDecorated(true);
    
    //    Anche quì sotto non son sicuro di quello che ho scritto...tu che dici?
    
            // Choice è di AWT, non "mischiare" componenti AWT e Swing, usa JComboBox
    	Choice theoptions = new Choice();
    	  theoptions.addItem("Aggiungi dipendente");
    	  theoptions.addItem("Aggiorna dipendente");
    	  theoptions.addItem("Annulla dipendente");
    		contentPane.add(theoptions);
    
    //Aggiungo i JButton (con i nomi)
            // Qui stai definendo variabili locali, non stai assegnando ai campi di istanza
    	JButton fineButton = new JButton("Fine");
    		contentPane.add(fineButton);
    
    	JButton annullaButton = new JButton("Annulla");
    		contentPane.add(annullaButton);
    
        .........
    }
    Quello che non va l'ho segnato in rosso.

    P.S. Scrivi il codice ben indentato .... così come è scritto fa incrociare gli occhi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.