Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it
    Registrato dal
    May 2013
    Messaggi
    5

    non-static variable this cannot be referenced from a static context

    Ho scritto il codice riportato di seguito con l'intento di avere le n frequenze più alte o più basse di un qualsiasi file di testo, ma durante la compilazione mi dà l'errore che ho riportato nel titolo della discussione e non so come ovviare al problema, non ci ho mai capito molto tra static, istanze ecc. Vi ringrazio in anticipo

    codice:
    import java.awt.event.*;
    import java.awt.*;
    import javax.swing.*; 
    
    public class FrequenzaFile extends JFrame
    {
      private JButton jBNumTop=new JButton("10");
      private JButton jBscelta=new JButton("Scelta file");
      private JFileChooser File_scelta= new JFileChooser();
      private JPanel jPdati= new JPanel();
      private JPanel jPmenu= new JPanel();
      private JButton jBFreqA=new JButton("N frequenze più alte");
      private JButton jBFreqB=new JButton("N frequenze più basse");
      String nomeFile="";
      public FrequenzaFile (int larg,int altezza)
      {   setSize(larg,altezza);
          Container contenitore=getContentPane();
          contenitore.setLayout(new BorderLayout());
          jPmenu.setLayout(new GridLayout(2,3));
          jPmenu.add(jBscelta);jBscelta.addActionListener(new EvButton());
          jPmenu.add(new Label("Numero caratteri più frequenti:"));
          jPmenu.add(jBNumTop); jBNumTop.addActionListener(new EvButton2());
          jPmenu.add(new Label("Quali frequeze desideri?"));
          jPmenu.add(jBFreqA);
          jPmenu.add(jBFreqB);   
          contenitore.add(jPmenu,"North");
          contenitore.add(jPdati,"Center");
      }
      public static void main(String arg[])
      {  FrequenzaFile F_uno=new FrequenzaFile(600,600);
         F_uno.addWindowListener(new ev_Finestra());
        // F_uno.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
         F_uno.setLocation(200,0);
         F_uno.setVisible(true);
      }
      public void paintComponent(Graphics g)
      {   paintComponents(g); paintAll(g);}
      private void visualizza( FrequenzaByte topChar[], int numTotale)
      {   String [] titCol={"codice","car","freq.ass.","freq.rel."};
          jPdati.removeAll();
          jPdati.setLayout(new GridLayout(topChar.length+1, titCol.length));
          for(int i=0; i<titCol.length; i++){
              jPdati.add(new JButton(titCol[i]));
            }
          for(int i=0;i<topChar.length;i++){
              jPdati.add(new JButton(""+(int)topChar[i].carattere));
              jPdati.add(new JButton(""+topChar[i].carattere));
              jPdati.add(new JButton(""+topChar[i].frequenza));
              jPdati.add(new JButton(""+topChar[i].frequenza*100/numTotale+"%"));
            }
          setVisible(true);
      }
      private void aggiorna()
      {  int n=(Integer.parseInt(jBNumTop.getText())+1)%16+5;
          jBNumTop.setText(""+n);
          if(nomeFile.length()==0) selezionaFile();
          else statisticheFile(nomeFile);
      }
      private void selezionaFile()
      {  try{if (File_scelta.showOpenDialog(null)==JFileChooser.APPROVE_OPTION)
                {nomeFile=File_scelta.getSelectedFile().getPath();
                 statisticheFile(nomeFile);
                }
             }  
         catch(Exception ex) {System.out.println(ex.getMessage());}
      } 
      private void statisticheFile(String nomefile){
         Frequenze freq=new Frequenze();
         freq.frequenzedaFile(nomeFile);
         int numTop=Integer.parseInt(jBNumTop.getText());
         int totale=freq.conta();
         visualizza(freq.topFrequenze(numTop),totale);
      }
      private void selezionaFrequenza()
      { String freq=JOptionPane.showInputDialog(null,"Di quanti caratteri si desidera la frequeza?","10");
         jBNumTop.setText(freq);
      }
      class EvButton2 implements ActionListener
      { public void actionPerformed(java.awt.event.ActionEvent evt)
          {
              selezionaFrequenza();
          }
      }
      class EvButton implements ActionListener
      {   public void actionPerformed(java.awt.event.ActionEvent evt)
          {  selezionaFile();
          }
      }    
      class ev_Finestra extends WindowAdapter
      { private void windowClosing(WindowEvent event)
          {JOptionPane p1=new JOptionPane();
           int x=p1.showConfirmDialog(null,"Conferma per terminare","ATTENZIONE",2);
           if(x==JOptionPane.YES_OPTION)System.exit(0);
          }
      }    
    }

    Questa è u altra classe contenuta nella stessa cartelle, non so se può essere d'aiuto:
    codice:
    import java.io.*;
    public class FrequenzaByte
    {   char carattere;
        int frequenza;
        public FrequenzaByte(char c, int fr)
        {  carattere=c;
           frequenza=fr;
        }
    } 
    class Frequenze
    {  int[] frequenze= new int[256];
       public Frequenze()
       {  for(int i=0; i<frequenze.length;i++)
              frequenze[i]=0;
       }
       private int indMaxVettore( int [] v)
       {  int indMax=0;
          for(int i=0;i<v.length;i++)
             if(v[indMax]<v[i]) indMax=i;
          return indMax;
       }
       public int conta()
       {  int s=0;
          for(int i=0;i<frequenze.length;i++)
             s+=frequenze[i];
          return s;
       }
       public void frequenzedaFile(String nomeFile)
       {  frequenze=new int[256];
          for(int i=0;i<frequenze.length;i++) frequenze[i]=0;
          RandomAccessFile f;
          try{f=new RandomAccessFile(nomeFile, "rw");
              int byteLetto;
              try{ while((byteLetto=f.readByte())!=-1)
                       frequenze[byteLetto]++;
                 }
              finally {f.close();}
             }
          catch(Exception ex) {System.out.println(ex.getMessage());}
       }
       public FrequenzaByte[] topFrequenze(int numTop)
       {  FrequenzaByte[] topByte= new FrequenzaByte[numTop];
          int indMax=0;
          for(int i=0;i<topByte.length;i++){
             topByte[i]=new FrequenzaByte((char)indMax,frequenze[indMax]);
             frequenze[indMax]=0;
          }
          return topByte;
       }
    }

  2. #2
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Magari un codice un po' meno compatto e formattato meglio aiuterebbe la leggibilità

    Il problema comunque è semplice: in un metodo static non puoi chiamare "cose" non static.

    Tu hai un main (che è static) in cui stai chiamando ev_Finestra che però è una classe interna di FrequenzaFile.
    Comunque non ha alcun senso che il main chiami addWindowsListener, fallo fare al costruttore di FrequenzaFile, no? E' quel costruttore che prepara l'oggetto, il main deve solo lanciarlo... (e quella classe dovrebbe occuparsi solo della visualizzazione, delegando la logica di business ad altri oggetti)
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  3. #3
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Aggiungo:

    codice:
    try 
    {
        ...
    }
    catch(Exception ex) 
    {
        System.out.println(ex.getMessage());
    }


    MAI, MAI soffocare le eccezioni!
    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
    Registrato dal
    May 2013
    Messaggi
    5
    Grazie mille ancora per il suggerimento

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.