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

    Problema con metodo static

    ciao
    ho scritto un programma in java di 2 classi, che semplicemente fa apparire un testo quando si clicca un bottone.
    codice:
    import javax.swing.*;
    import java.awt.*;
    class Programma1 extends JFrame
    {
    	Label Etichetta=new Label();
    	Button Bottone=new Button();
    	public Programma1()
    	{
    		super("Programma 1");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setLocation(490,340);
    		setSize(300,120);
    		setVisible(true);
    		setResizable(false);
    		Bottone.addActionListener(new Listener1());
    		Bottone.setLabel("Visualizza testo");
    		add(Bottone);
    		add(Etichetta);
    	}
    	public static void main(String[] args)
    	{
    		new Programma1();
    	}
    }
    codice:
    import java.awt.*;
    import java.awt.event.*;
    class Listener1 implements ActionListener
    {
    	public void actionPerformed(ActionEvent e)
    	{
    		Programma1.Etichetta.setText("Testo da visualizzare");
    	}
    }
    e mi da l'errore
    codice:
    Listener1.java:7: non-static variable Etichetta cannot be referenced from a static context
                    Programma1.Etichetta.setText("Testo da visualizzare");
    credo sia perchè il metodo Programma1 è richiamato da un contesto statico... come posso risolvere? grazie ciao

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Problema con metodo static

    Originariamente inviato da furbostandby
    e mi da l'errore
    codice:
    Listener1.java:7: non-static variable Etichetta cannot be referenced from a static context
                    Programma1.Etichetta.setText("Testo da visualizzare");
    credo sia perchè il metodo Programma1 è richiamato da un contesto statico... come posso risolvere? grazie ciao
    No, approccio parecchio sbagliato. La gestione degli eventi è una cosa che generalmente richiede una certa "intimità" con la classe dove sono gestiti i componenti.
    Pertanto tipicamente si implementa il XyzListener in qualche modo all'interno della classe che gestisce i componenti (nel tuo caso è Programma1 che è-un JFrame).

    Le opzioni sono svariate: Programma1 che implementa ActionListener, oppure ActionListener implementato in una inner-class (tipicamente una "regular" inner-class o una "anonymous" inner-class) e sopratutto tenuta privata.

    Implementare il listener in una classe completamente slegata da quella dove ci sono i componenti è critico. Sarebbe un pessimo "design" ma oltretutto dal punto di vista tecnico richiederebbe accorgimenti ... anche qui dubbi.

    Listener1 dovrebbe ricevere un reference alla istanza di Programma1. Facilissimo: basta che Listener1 abbia un costruttore e un campo apposito dove tenersi il reference e Programma1 lo istanza passando this, il reference a sé stesso.
    Ma poi? Devi accedere al campo, cosa fai ... lo rendi "pubblico"? Sbagliato, pessimo design. Potresti mettere in Programma1 un metodo es. setTestoEtichetta(String) pubblico ovviamente. Sarebbe già un po' meglio ma così comunque "apri" a chiunque la possibilità di settare il campo. È davvero necessario?

    Queste sono questioni di "design" ... prima le comprendi, prima svilupperai bene e meglio.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Sì, ammetto di essere un po imbranato con java, ma mi devi scusare perchè sono alle prime armi, e questo è il mio primo programma che contiene eventi.
    Avevo commesso l'errore di creare l'ascoltatore al di fuori dalla classe principale, ora ho risolto.
    Grazie mille, è bello sapere che qualcuno si aempre disposto ad aiutarmi.
    Ciao!

    P.S: Finchè non ho cambiato nell'ascoltatore
    trasformando da
    codice:
    Programma1.Etichetta.setText("Testo da visualizzare");
    a
    codice:
    Etichetta.setText("Testo da visualizzare");
    ha continuato a dare lo stesso errore. Perche?

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Il codice che hai postato è incompleto per capire il problema.
    Comunque, il problema di compilazione che avevi precedentemente era dovuto al fatto che cercavi di chiamare un attributo (quindi una variabile d'oggetto) trattandola come una variabile statica (quindi una variabile di classe)

    P.S.: per convenzione ormai stra-consolidata, usa l'iniziale maiuscola per i nomi di classe e l'inizialie minuscola per gli identificatori di oggetti/variabili. Rende il codice più chiaro a te, e a chiunque altro deve analizzarlo!

  5. #5
    va bene grazie del consiglio ciao
    comunque l'ultima domanda che ho fatto è relativa a questo codice:
    codice:
    import javax.swing.*;
    import java.awt.*;
    class Programma1 extends JFrame
    {
    	Label Etichetta=new Label();
    	Button Bottone=new Button();
    	public Programma1()
    	{
    		super("Programma 1");
    		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		setLocation(490,340);
    		setSize(300,120);
    		setVisible(true);
    		setResizable(false);
    		Bottone.addActionListener(new Listener1());
    		Bottone.setLabel("Visualizza testo");
    		add(Bottone);
    		add(Etichetta);
    	}
            import java.awt.*;
            import java.awt.event.*;
            class Listener1 implements ActionListener
            {
    	        public void actionPerformed(ActionEvent e)
    	        {
    		      Programma1.Etichetta.setText("Testo da visualizzare");
                          /*Qui ha funzionato soltanto modificandolo così:
                          Etichetta.setText("Testo da visualizzare");
                          altrimenti dava l'errore postato sopra. Perchè?*/
    	        }
            }
    	public static void main(String[] args)
    	{
    		new Programma1();
    	}
    }

  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da furbostandby
    va bene grazie del consiglio ciao
    comunque l'ultima domanda che ho fatto è relativa a questo codice:
    codice:
       ...
    /*Qui ha funzionato soltanto modificandolo così:
       Etichetta.setText("Testo da visualizzare");
       altrimenti dava l'errore postato sopra. Perchè?*/
    Perchè "Etichetta" è, appunto, un campo di istanza e non un campo di classe (statico), quindi non lo puoi referenziare tramite il nome della classe, ma solo tramite un'istanza della classe (lì è implicito un this):

    codice:
       this.Etichetta.setText("Testo da visualizzare");
    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

  7. #7

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.