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

    JAVA - non-static method cannot be referenced froma static context

    Salve a tutti, ho un problema che mi sta facendo impazzire:

    codice:
    public class edicola
    {
       private JDesktopPane mydesktop;
       
       public static void main(String[] args) {
          edicola istanzaEdicola = new edicola();
          istanzaEdicola.creaFrame();
       }
    	
       public void creaFrame()
       {
    	//crea il frame
       }
    	
       public void aggiungiFinestraInterna(JInternalFrame intFra) {
          JInternalFrame FrameDaAggiungere = intFra;
          mydesktop.add(FrameDaAggiungere);
       }
    }
    questa è la classe con il main (in cui ho dovuto creare un oggetto della stessa classe e chiamarci la funzione che crea il frame -soluzione trovata sul forum java.sun.com-)

    ora, in un'altra classe ho questo:

    codice:
    public class sviluppoQuotidiani extends JInternalFrame
    {
       //creo il frame interno con i componenti che mi servono
    
       edicola.aggiungiFinestraInterna(sviluppo); 
       sviluppo.pack();
       sviluppo.setVisible(true);
    }
    dove ovviamente: JInternalFrame sviluppo = new JInternalFrame(...)
    quando chiamo il metodo della classe edicola (la prima classe scritta sopra) ottengo l'errore:

    non-static method aggiungiFinestraInterna(javax.swing.JInternalFrame ) cannot be referenced froma static context
    l'unica soluzione è dichiarare il metodo aggiungiFinestraInterna della classe edicola come static????
    Mi sembra strano in quanto se questa fosse l'unica soluzione dovrei dichiarare tutti i metodi di una classe, che vengono usati anche da altre classi, come "public static..." e non mi sembra una cosa molto sensata!

  2. #2
    senza contare che dichiarando il metodo come "public static..." in compilazione ottengo:

    non-static variable mydesktop cannot be referenced from a static context mydesktop.add(FrameDaAggiungere);

  3. #3
    lo static serve per indicare metodi che possono essere utilizzati senza istanziare oggetti del tipo della classe...per capirci nel tuo caso così come hai scritto il codice non puoi scrivere

    codice:
    edicola.aggiungiFinestraInterna(sviluppo);
    e basta ma dovresti prima creare un oggetto di tipo edicola:

    codice:
    edicola e = new edicola()
    edicola.aggiungiFinestraInterna(sviluppo);
    in alternativa puoi lasciare solo quello che hai scritto tu e mettere il metodo che usi come static.

    Per quanto riguarda il problema della variabile mydesktop semplicemente devi sapere che nei metodi static puoi usare solo variabili static. Se dichiari una variabile dentro ad un metodo che è static è resa static automaticamente (per esempio se dichiari una variabile qualsiasi nel main), in caso contrario devi esplicitare il fatto che la variabile è static:

    codice:
    private static JDesktopPane mydesktop;
    Quindi per riassumere io fari così:

    codice:
    public class edicola
    {
       private static JDesktopPane mydesktop;
       
       public static void main(String[] args) {
          edicola istanzaEdicola = new edicola();
          istanzaEdicola.creaFrame();
       }
    	
       public void creaFrame()
       {
    	//crea il frame
       }
    	
       public void aggiungiFinestraInterna(JInternalFrame intFra) {
          JInternalFrame FrameDaAggiungere = intFra;
          mydesktop.add(FrameDaAggiungere);
       }
    }
    e l'altra classe lasciarla uguale:

    codice:
    public class sviluppoQuotidiani extends JInternalFrame
    {
       //creo il frame interno con i componenti che mi servono
    
       edicola.aggiungiFinestraInterna(sviluppo); 
       sviluppo.pack();
       sviluppo.setVisible(true);
    }
    Spero di averti chiarito la cosa!

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  4. #4
    ho messo mydesktop e aggiungifinestrainterna solamente public ed ho fatto come hai scritto:
    edicola e = new edicola()
    edicola.aggiungifinestrainterna(sviluppo)

    ma edicola non ha un costruttore, ha solamente il main e il metodo creaFrame()



    ora li setto static e buonanotte!
    solo che mi sembra strano che sia l'unica soluzione!

  5. #5
    se tu non definisci il costruttore di una classe non importa puoi comunque istanziare oggetti del tipo di quella classe, viene assegnato un costruttore standard che non ha parametri in ingresso!
    Mettere public o private non cambia niente ai fini del tuo problema!

    Ciao.
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

  6. #6
    si si lo so, il problema è che non funziona neanche istanziando un oggetto della classe edicola, mi da un errore di nullpointerexception qui:

    public void aggiungiFinestraInterna(JInternalFrame intFra) {
    JInternalFrame FrameDaAggiungere = intFra;
    ---> mydesktop.add(FrameDaAggiungere);
    }

    e ovviamente quando chiamo la funzione dall'altra classe

    edicola e = new edicola();
    ---> e.aggiungiFinestraInterna(sviluppo);

    per questo ho scritto
    ora li setto static e buonanotte!
    solo che mi sembra strano che sia l'unica soluzione!

  7. #7
    ma sviluppo cosa sarebbe? E dove lo definisci?
    Si può vincere o perdere, l'importante è vincere o perdere da uomini...

    Neverland - Il mio Forum

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