Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 20

Discussione: Evento su bottone

  1. #1
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683

    Evento su bottone

    ciao a tutti!!
    sto imparando a programmare in java.
    fino ad aggiungere label e button ok.
    ma ora ho un problema, vorrei assegnare un evento al button.
    ho fatto questo codice:
    codice:
    import javax.swing.*;
    public class swing {
    	public static void main(String[] args){
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    		JPanel panel = new JPanel();
    		frame.add(panel);
    		
    		private class MyButtonListener implements ActionListener {
    			public void actionPerformed(ActionEvent evt) {
    				System.out.print("ciao ita");
    			}
    		}
    		
    		JButton button = new JButton("Hello again");
    		MyButtonListener listener = new MyButtonListener();
    		button.addActionListener(listener);		
    	}
    }
    ERRORE: Exception in thread "main" java.lang.Error: Unresolved compilation problems:
    Illegal modifier for the local class MyButtonListener; only abstract or final is permitted
    ActionListener cannot be resolved to a type
    ActionEvent cannot be resolved to a type
    The method addActionListener(ActionListener) in the type AbstractButton is not applicable for the arguments (MyButtonListener)

    at swing.main(swing.java:12)


    Linea 12: private class MyButtonListener implements ActionListener {

  2. #2
    ci sono una serie di errori:
    - l'ActionListener, così come gli altri ascoltatori, sono del package java.awt.event
    - la tua classe MyButtonListener è dichiarata nel main quando va dichiarata all'esterno di un metodo
    - i nomi delle classi iniziano con la maiuscola
    - il bottone non viene aggiunto a nessun pannello
    - la tua variabile listener non è statica

  3. #3
    Beh ci eri quasi. Devi dichiarare la classe MyButtonListener fuori dal metodo main.
    Essendo il contesto statico, devi anche dichiararla come classe statica.
    Inoltre devi importare ActionEvent e ActionListener.

    codice:
    package desktop;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main {
            private static class MyButtonListener implements ActionListener {
                public void actionPerformed(ActionEvent evt) {
                    System.out.print("ciao ita");
                }
            }
    
    	public static void main(String[] args){
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		JPanel panel = new JPanel();		
    		JButton button = new JButton("Hello again");
                    panel.add(button);
    
                    frame.add(panel);
    		MyButtonListener listener = new MyButtonListener();
    		button.addActionListener(listener);
    	}
    }
    Volendo, puoi anche usare classi anonime:

    codice:
    package desktop;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main {
    
    	public static void main(String[] args){
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		JPanel panel = new JPanel();		
    		JButton button = new JButton("Hello again");
                    panel.add(button);
    
                    frame.add(panel);
    		button.addActionListener(new ActionListener()
                        {
                            public void actionPerformed(ActionEvent e)
                            {
                                System.out.println("Ciao");
                            }
                        }
                    );
    	}
    }
    O, in maniera simile al tuo codice iniziale:

    codice:
    package desktop;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main {
    	public static void main(String[] args){
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
    		JPanel panel = new JPanel();
    		
    
                    ActionListener listener = new ActionListener()
                        {
    
                            public void actionPerformed(ActionEvent e)
                            {
                                System.out.println("ciao");
                            }                    
                        };
                        
    		JButton button = new JButton("Hello again");
                    panel.add(button);
                    frame.add(panel);
    		button.addActionListener(listener);
    	}
    }
    Fai caso a questo "panel.add(button);". Se non lo metti dentro al panel, non lo vedrai sullo schermo.

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    Della classe che stava fuori dal main infatti lo sospettavo.. un pò come nel C e altri linguaggi.
    il panel.add(button); l'avevo pure messo... non so che mi passava per la testa quando l'ho tolto.. bo grazie mille comunque... ora li analizzo, faccio le mie prove, poi se ho problemi chiedo ancora

  5. #5
    meglio ancora, per non dichiararsi una classe per abilitare un bottone, puoi fare così:

    codice:
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Swing extends JFrame {
    
        public Swing(){
            super("Test");
            JButton button=new JButton("Hello again");
            button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.out.println("ciao ita");
                }
            });
            getContentPane().add(button);
            setSize(200, 200);
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setVisible(true);
        }
    
        public static void main(String argv[]){
            new Swing();
        }
    }
    potresti anche fare tutto nel main, ma non potresti usare il super e dovresti dichiararti una variabile locale di tipo JFrame, tipo così:
    codice:
    import javax.swing.*;
    import java.awt.event.*;
    
    public class Swing{
    
        public static void main(String argv[]){
            JFrame f=new JFrame("Test");
            JButton button=new JButton("Hello again");
            button.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent e){
                    System.out.println("ciao ita");
                }
            });
            f.getContentPane().add(button);
            f.setSize(200, 200);
            f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            f.setVisible(true);
        }
    }

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da iacoposk8
    Della classe che stava fuori dal main infatti lo sospettavo.. un pò come nel C e altri linguaggi.
    In Java una classe può anche essere dichiarata dentro un metodo, si chiamano "local" inner class.

    Se nel tuo codice iniziale mettevi l'import per le classi in java.awt.event e toglievi il 'private' in quel MyButtonListener ... tecnicamente sarebbe stato tutto corretto.

    Comunque no, se non si conoscono bene le regole sulle inner class (comprese quelle "local"), sarebbe bene evitare cose di quel tipo.

    La gestione degli eventi, ovvero la implementazione di un XYZListener si fa generalmente/tipicamente in uno di questi modi:
    - la tua classe principale (quella che estende JFrame nel tuo caso) che implementa XYZListener.
    - implementare XYZListener in una normale (detta "regular") inner class. Una classe (in questo caso meglio private) messa dentro la tua classe principale ma fuori dai metodi!
    - implementare XYZListener in una anonymous inner class (che può essere dentro un metodo o costruttore).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    ok!!! perfetto!!! è tutto chiaro...
    sto ancora famigliarizzando con questo java

  8. #8
    Utente di HTML.it
    Registrato dal
    May 2008
    Messaggi
    1,683
    ora ho provato a stampare ciao non nella consolle, ma nella finestra del bottone
    ho scritto così (ho aggiunto una label al posto del system.out.print nella descrizione dell'evento):

    codice:
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main 
    {
    	public static void main(String[] args)
    	{
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    	ActionListener listener = new ActionListener()
            {
    		public void actionPerformed(ActionEvent e)
                    {
    			JLabel label = new JLabel("ciao");
    			panel.add(label);
                    }                    
            };		
            JPanel panel = new JPanel();  
    	JButton button = new JButton("clicca qua");
            panel.add(button);
            frame.add(panel);        
    	button.addActionListener(listener);
    	}
    }
    Errore: Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    panel cannot be resolved

    at Main.main(Main.java:19)


    Linea 19: panel.add(label);

  9. #9
    Accedi a "panel" da una inner class. Questo è possibile se
    1. panel è dichiarata prima della inner class
    2. panel è final

    Quindi qualcosa simile:

    codice:
    package desktop;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main
    {
    	public static void main(String[] args)
    	{
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                    JPanel panel = new JPanel();
                    final JLabel label = new JLabel("Testo della label");
                    JButton button = new JButton("clicca qua");
    
                    panel.add(button);
                    panel.add(label);
    
                    ActionListener listener = new ActionListener()
                    {
                        public void actionPerformed(ActionEvent e)
                        {
                            label.setText("ciao");
                        }
                    };
            
                    frame.add(panel);
                    button.addActionListener(listener);
    	}
    }
    Solitamente si scrive codice più flessibile comunque. Il tuo esempio diverrebbe qualcosa di simile:

    codice:
    package desktop;
    
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main extends JFrame
    {
        private JLabel label;
        private JButton button;
    
        public Main()
        {
            label = new JLabel("Testo della label");
            button = new JButton("Click");
            button.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        if(label.getText().equals("CIAO"))
                        {
                            label.setText("HELLO");
                        }
                        else
                        {
                            label.setText("CIAO");
                        }
                    }
                }
            );
    
            JPanel panel = new JPanel();
            panel.add(button);
            panel.add(label);
            
    
            this.setContentPane(panel);
    
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setSize(200,200);
        }
    
        public static void main(String[] args)
        {
            SwingUtilities.invokeLater(new Runnable()
                {
                    public void run()
                    {
                        new Main().setVisible(true);
                    }
                }
            );
        }
    }
    Ti consiglio di strutturare i tuoi programmi visuali così o quasi.

  10. #10
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Originariamente inviato da iacoposk8
    ora ho provato a stampare ciao non nella consolle, ma nella finestra del bottone
    ho scritto così (ho aggiunto una label al posto del system.out.print nella descrizione dell'evento):

    codice:
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import javax.swing.*;
    
    public class Main 
    {
    	public static void main(String[] args)
    	{
    		JFrame frame = new JFrame("Test");
    		frame.setVisible(true);
    		frame.setSize(200,200);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		
    	ActionListener listener = new ActionListener()
            {
    		public void actionPerformed(ActionEvent e)
                    {
    			JLabel label = new JLabel("ciao");
    			panel.add(label);
                    }                    
            };		
            JPanel panel = new JPanel();  
    	JButton button = new JButton("clicca qua");
            panel.add(button);
            frame.add(panel);        
    	button.addActionListener(listener);
    	}
    }
    Errore: Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    panel cannot be resolved

    at Main.main(Main.java:19)


    Linea 19: panel.add(label);
    "panel" è dichiarato dopo il suo utilizzo. Sposta la sua dichiarazione prima della creazione dell'ActionListener e dichiaralo final.
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

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 © 2026 vBulletin Solutions, Inc. All rights reserved.