Invio parametri ad altra classe

di il
9 risposte

Invio parametri ad altra classe

Buongiorno,

Alcuni giorni mi avete aiutato a risolvere un un "problema" (Due combobox and "go") adesso mi sto scervellando per risolvere questo.
In poche parole... devo passare i valori di anno e mese ad un'altra Class che li elabora e mostra il risultato.
La ClassshowData se provata da sola funziona correttamente, ma anno e mese hanno valori fissi e questo non è utile

Questo è il codice con cui, dopo un test di connessione, provo ad inviare anno e mese in elaborazione

public void checkConnect(String anno, String mese){
        
        try {
            Class.forName("com.mysql.jdbc.Driver");
            conn = DriverManager.getConnection("jdbc:mysql://localhost/mambo","user","psw");
            
            String workData = anno + " " + mese;
            showData.showData(workData); //non-static method showData(String) cannot be referenced from a static context
        }
        catch(Exception sqle) {
            String error = sqle.getMessage();
            JOptionPane.showMessageDialog(null,error,"Errore di connessione",JOptionPane.ERROR_MESSAGE);
            System.exit(1);
        }
    }


Come ho impostato showData mi da l'errore che vedete accanto

E questa è la classe a cui vorrei indirizzare anno e mese. Le variabili usate nel SELECT dovrebbero essere sostituite da anno e mese.

 public class showData  extends JPanel{

    static final String USERNAME = "usr";
    static final String PASSWORD = "psw";
    static final String CONN_STRING = "jdbc:mysql://localhost:3306/mambo";

    JTable jt;
    public void showData (String workData) {
            try {
            
            LocalDate now = LocalDate.now();
            int this_year = now.getYear();
            int this_month = now.getMonthValue();
            int daysinmonth = now.lengthOfMonth();
            String questoanno =String.valueOf(this_year);  
            String questomese =String.valueOf(this_month); 
            
            String[] columnNames = {"Anno "+questoanno, "Mese "+questomese}; 
            String[] colonne = {"Nome", "1", ... "31" }; // eliminato gli intermedi per comodità vostra
            DefaultTableModel tableModel = new DefaultTableModel(columnNames, 0);
            DefaultTableModel NomeGiorni = new DefaultTableModel(colonne, 0);
            Connection conn;
            conn = DriverManager.getConnection(CONN_STRING, USERNAME, PASSWORD);
            Statement stmt = (Statement) conn.createStatement();
            String query = "Select * from alldata where anno = "+anno+" and mese = "+mese+"";
            ResultSet rs = stmt.executeQuery(query);

            int i = 0;
            ArrayList<String> what = new ArrayList<String>();

            String[] whatArr = new String[what.size()];
            while (rs.next()) {
                 ......
               whatArr = what.toArray(whatArr);
                // create a single array of one row's worth of data
                String[] data = { nome, d1, ... d31  } ;
                // create a single array of one row's worth of data
               
                // and add this row of data into the table model
                NomeGiorni.addRow(data);
                
                //tableModel.addRow(whatArr);
            }
            jt = new JTable(tableModel); // to create a new JTable
            jt = new JTable(NomeGiorni); // to create a new JTable
            jt.setPreferredScrollableViewportSize(new Dimension(1300, 200));
            jt.setFillsViewportHeight(true);

            JScrollPane jps = new JScrollPane(jt);
            add(jps);
        }
        catch (Exception er) {System.err.println(er);}
    }

    /*** when this Class is under test "joe" becomes the main ***/
    public static void joe() {
        JFrame jf = new JFrame();
        showData t = new showData();
        jf.setTitle("Test");
        jf.setSize(1350,400);
        jf.setVisible(true);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.add(t);
    }
}
L'entry point della classe, a mio avviso, dovrebbe essere "joe()" visto che è l'origine di tutta la parte grafica, ma non va.

Grazie per l'eventuale soluzione
paps

9 Risposte

  • Re: Invio parametri ad altra classe

    Dovresti rendere il metodo showData statico, in quanto leggendo l'errore il metodo checkConnect si trova in un contesto statico (chiamato dal main?).
    Dal codice che hai postato, inoltre, si nota che non stai istanziando una classe ShowData, di conseguenza non puoi utilizzare il metodo in quel modo, quindi un'altra soluzione è creare un'istanza.

    P.S.: Per convenzione, mai per polemica, in Java siamo soliti far iniziare la classe con una lettera maiuscola, può sembrar banale ma aiuta MOLTISSIMO nella comprensione del codice, sia per te che lo scrivi che per un eventuale lettore futuro.
  • Re: Invio parametri ad altra classe

    Sh3dir ha scritto:


    Dovresti rendere il metodo showData statico
    Direi che è una pessima idea, perché si trova in una classe "JPanel" quindi si presuppone l'utilizzo di una istanza specifica e che contiene sicuramente dello "stato". Quindi va fatto ragionando in termini oop.
  • Re: Invio parametri ad altra classe

    andbin ha scritto:


    Sh3dir ha scritto:


    Dovresti rendere il metodo showData statico
    Direi che è una pessima idea, perché si trova in una classe "JPanel" quindi si presuppone l'utilizzo di una istanza specifica e che contiene sicuramente dello "stato". Quindi va fatto ragionando in termini oop.
    Si è una pessima strategia.

    Istanzia ShowData e dovrebbe andare.
  • Re: Invio parametri ad altra classe

    Abbiate pazienza, ma specificatamente cosa dovrei fare. Ho guardato in giro per la rete ma mi ritrovo con della gran confusione in testa
  • Re: Invio parametri ad altra classe

    Istanziare una classe sostanzialmente significa dichiarare un riferimento ad una classe ed istanziarla con la keyword new, chiamando un suo costruttore.
    Poi chiamare il metodo su questo riferimento.
    
    ShowData sd = new ShowData();
    sd.showData(data);
     
  • Re: Invio parametri ad altra classe

    Scusami, ma è già istanziata. In fondo alla seconda parte del codice che ho inviato.
    /*** when this Class is under test "joe" becomes the main ***/
        public static void joe() {
            JFrame jf = new JFrame();
            showData t = new showData();
            jf.setTitle("Test");
            jf.setSize(1350,400);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.add(t);
        }
    
  • Re: Invio parametri ad altra classe

    paps ha scritto:


    public void checkConnect(String anno, String mese){
            
            try {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost/mambo","user","psw");
                
                String workData = anno + " " + mese;
                showData.showData(workData); //non-static method showData(String) cannot be referenced from a static context
            }
            catch(Exception sqle) {
                String error = sqle.getMessage();
                JOptionPane.showMessageDialog(null,error,"Errore di connessione",JOptionPane.ERROR_MESSAGE);
                System.exit(1);
            }
        }
    Non qui, stai chiamando il metodo come se fosse statico, dovresti chiamarlo sul riferimento che ti sei creato nel tuo main(joe)
  • Re: Invio parametri ad altra classe

    Abbi pazienza ma mi sa che non ci capiamo
    Questa è la classe che lancia il tutto. All'interno di questa classe c'è il metodo
    public class MamboUI extends javax.swing.JFrame {
    
        
        String anno;
        String mese;
        
        public MamboUI() {
            initComponents();
           
        }
        Connection conn = null;
        
        [...] //creazione parte grafica
        
        public void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
            String anno = (String) comboAnno.getSelectedItem();
            String mese = (String) comboMese.getSelectedItem();
            checkConnection(anno, mese);
            
        }
    
       public void checkConnect(String anno, String mese){
            
            try 
             {
                Class.forName("com.mysql.jdbc.Driver");
                conn = DriverManager.getConnection("jdbc:mysql://localhost/mambo","root","fidonet9969");
                Statement stmt = (Statement) conn.createStatement();
                
                
                String workData = anno + " " +mese;
                
    /*********************************************            
    *   
    *   LA SEGUENTE LINEA DA ERRORE: non-static method showData(String) cannot be referenced from a static context
    *
    *
                showData.showData(workData);  
     
    *
    *
    *
    *
    **********************************************/ 
     
                
                }
            
            catch(Exception sqle) {
                String error = sqle.getMessage();
                JOptionPane.showMessageDialog(null,error,"Errore di connessione",JOptionPane.ERROR_MESSAGE);
                System.exit(1);
               }
        }
       
        
        public void main(String args[]) {
            
            java.awt.EventQueue.invokeLater(new Runnable() {
                public void run() {
                    new MamboUI().setVisible(true);
                }
            });
        }
    }

    Questa è la classe a cui è destinata quella linea di codice che da errore

    public class showData  extends JPanel{
    
        JTable jt;
        public void showData (String workData) {
            
    /****     codice per visualizzazione e che al momento utilizza dati fissi *****/
                
        }
    
    /****** Questo non è un main ma un metodo che in caso debba debuggare solo il file shoData.java diventa main ****/
    
        public static void joe() {
            JFrame jf = new JFrame();
            
    /*****************************************        
    *   Qui è dove è istanziata la class showData
    *
    *        
            showData t = new showData();
    *
    *
    *******************************************/
            jf.setTitle("Test");
            jf.setSize(1350,400);
            jf.setVisible(true);
            jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            jf.add(t);
        }
    
        
        
    }
    
  • Re: Invio parametri ad altra classe

    
      showData.showData(workData);  
    
    Questo è il modo in cui si chiama un metodo STATICO. Non essendo showData un metodo statico, ti da errore.
    Come ti avevo suggerito renderlo statico risolverebbe il problema ma come @andbin ha fatto notare è concettualmente sbagliato dato che ShowData è un JPanel.

    Il fatto che tu crei un'istanza di showData nel metodo joe rimane lì, a meno che tu non la passi in qualche modo a checkConnect.
Devi accedere o registrarti per scrivere nel forum
9 risposte