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

    [JAVA] - Inserire risultato query DBMS in JTable

    Salve tutti ragazzi,

    ho creato un piccolo database e l'ho importato in java.

    Fin qui tutto ok, ho creato una piccola Query sul database e salvato il risultato in un vettore "v". Ho implementato velocemente un piccolo ciclo per vedere se il vettore v era pieno oppure vuoto invece il vettore v viene inizializzato correttamente con tutti i campi presenti nel database.

    Adesso però vorrei che questi campi vengano visualizzato all'interno di una JTable in java. E' possibile fare ciò??

    Vi posto il codice delle due classi:

    CLASSE AllFrameDesktopContainer.JAVA
    codice:
    import javax.swing.*;
    import javax.swing.event.*;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    
    import java.awt.*;
    import java.awt.event.*;
    import java.util.Vector;
    
    public class AllFrameDesktopContainer{
      JDesktopPane desk;
      public int i;
      JInternalFrame iframe;
      JFrame frame;
      private javax.swing.JScrollPane jScrollPane1;
      private javax.swing.JTable jTable1;
      public static void main(String[] args) {
        AllFrameDesktopContainer d = new AllFrameDesktopContainer();
     
    
      }
    
      public AllFrameDesktopContainer(){
        frame = new JFrame("IceCream 1.0");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        desk = new JDesktopPane();
        
        Database db = new Database("iceCream");
        if ( !db.connetti() ) {
           System.out.println("Errore durante la connessione al database :(");
           System.out.println( db.getErrore() );
           System.exit(0);
        }
        else{
        	System.out.println("Mi sono connesso");
        }
        //eseguo una query sul database.
        
        Vector v = db.eseguiQuery( "SELECT * FROM Ingredienti;" );
     
       
     while ( i<v.size() ) {
               String[] record = (String[]) v.elementAt(i);
               System.out.println("Record numero " + (i+1) );
              for (int j=0; j<record.length; j++) {
                  System.out.println( record[j] );
               }
               i++;
            }
        
        Vector<String> columnName = new Vector<String>();
    
        try{ 
            iframe = new JInternalFrame("Internal Frame: " , true, true, true, true);    
            iframe.setVisible(true);
            desk.add(iframe);   
        }
        catch(NumberFormatException ne){   
          System.exit(0);
        }  
        //creo il Menù Principale
        JMenuBar menubar = new JMenuBar();
        
        //creo il menù file
        JMenu count = new JMenu("File");
        count.addMenuListener(new MyAction());
        menubar.add(count);
        
        //creo il menù Exit
        JMenu exit = new JMenu("Exit");
        exit.addMenuListener(new Esci());
        menubar.add(exit);
        
        
        frame.setJMenuBar(menubar);
        frame.add(desk);
        frame.setSize(800,600);
        frame.setVisible(true);
        
        
        //adesso crero una tabella
        jScrollPane1 = new javax.swing.JScrollPane();
        jTable1 = new javax.swing.JTable();
        DefaultTableModel model = new DefaultTableModel();
        model.setDataVector(v, columnName);
        jTable1.setModel(model);
        jScrollPane1.setName("jScrollPane1");
       jTable1.setName("jTable1"); 
        jScrollPane1.setViewportView(jTable1);
     
        iframe.getContentPane().add(jScrollPane1);
        iframe.pack();
        
      }
    
      public class MyAction implements MenuListener{
        public void menuSelected(MenuEvent me){
          
        }
    
        public void menuCanceled(MenuEvent me){}
    
        public void menuDeselected(MenuEvent me){}
      }
      
      public class Esci implements MenuListener{
    	    public void menuSelected(MenuEvent me){
    	        System.exit(0);
    	    }
    	    public void menuCanceled(MenuEvent me){}
    
    	    public void menuDeselected(MenuEvent me){}
    	  }
    }
    Questa invece è la classe relativa alla gesitone del database.

    codice:
    import java.sql.*;
    import java.util.Vector;
    
    import javax.swing.JTable;
    
    public class Database {
       private String nomeDB;       // Nome del Database a cui connettersi
       private String nomeUtente;   // Nome utente utilizzato per la connessione al Database
       private String pwdUtente;    // Password usata per la connessione al Database
       private String errore;       // Raccoglie informazioni riguardo l'ultima eccezione sollevata
       private static Connection db;       // La connessione col Database
       private boolean connesso;    // Flag che indica se la connessione è attiva o meno
       private String[][] cells = null;
       private String[] columnsName=null;
       public Database(String nomeDB) { this(nomeDB, "", ""); }
       public JTable tabella;
       public Database(String nomeDB, String nomeUtente, String pwdUtente) {
          this.nomeDB = nomeDB;
          this.nomeUtente = "root";
          this.pwdUtente = "pentathlon";
          connesso = false;
          errore = "";
       }
    
       // Apre la connessione con il Database
       public boolean connetti() {
          connesso = false;
          try {
    
             // Carico il driver JDBC per la connessione con il database MySQL
             Class.forName("com.mysql.jdbc.Driver");
    
             // Controllo che il nome del Database non sia nulla
             if (!nomeDB.equals("")) {
    
                // Controllo se il nome utente va usato o meno per la connessione
                if (nomeUtente.equals("")) {
    
                   // La connessione non richiede nome utente e password
                   db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB);
                } else {
    
                   // La connessione richiede nome utente, controllo se necessita anche della password
                   if (pwdUtente.equals("")) {
    
                      // La connessione non necessita di password
                      db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente);
                   } else {
    
                      // La connessione necessita della password
                      db = DriverManager.getConnection("jdbc:mysql://localhost/" + nomeDB + "?user=" + nomeUtente + "&password=" + pwdUtente);
                 
    
                   }
                }
    
                // La connessione è avvenuta con successo
                connesso = true;
             } else {
                System.out.println("Manca il nome del database!!");
                System.out.println("Scrivere il nome del database da utilizzare all'interno del file \"config.xml\"");
                System.exit(0);
             }
          } catch (Exception e) { errore = e.getMessage(); }
          return connesso;
       }
    
    
    
    // Esegue una query di selezione dati sul Database
       // query: una stringa che rappresenta un'istruzione SQL di tipo SELECT da eseguire
       // colonne: il numero di colonne di cui sarà composta la tupla del risultato
       // ritorna un Vector contenente tutte le tuple del risultato
       public Vector eseguiQuery(String query) {
          Vector v = null;
          String [] record;
          int colonne = 0;
          try {
             Statement stmt = db.createStatement();     // Creo lo Statement per l'esecuzione della query
             ResultSet rs = stmt.executeQuery(query);   // Ottengo il ResultSet dell'esecuzione della query
             v = new Vector();
             ResultSetMetaData rsmd = rs.getMetaData();
             colonne = rsmd.getColumnCount();
             
             System.out.println(colonne);
             while(rs.next()) {   // Creo il vettore risultato scorrendo tutto il ResultSet
                record = new String[colonne];
                for (int i=0; i<colonne; i++) record[i] = rs.getString(i+1);
                v.add( (String[]) record.clone() );
             }
             rs.close();     // Chiudo il ResultSet
             stmt.close();   // Chiudo lo Statement
          } catch (Exception e) { e.printStackTrace(); errore = e.getMessage(); }
    
          return v;
       }
       
       
    
       // Esegue una query di aggiornamento sul Database
       // query: una stringa che rappresenta un'istuzione SQL di tipo UPDATE da eseguire
       // ritorna TRUE se l'esecuzione è adata a buon fine, FALSE se c'è stata un'eccezione
       public boolean eseguiAggiornamento(String query) {
          int numero = 0;
          boolean risultato = false;
          try {
             Statement stmt = db.createStatement();
             numero = stmt.executeUpdate(query);
             risultato = true;
             stmt.close();
          } catch (Exception e) {
             e.printStackTrace();
             errore = e.getMessage();
             risultato = false;
          }
          return risultato;
       }
       //metodo aggiunto da me
       public int getRowCount() {
    	   
    	   return cells.length;
    	   }
       //metodo aggiunto da me
       public int getColumnCount() {
    	   
    	   return columnsName.length;
    	   }
       //metodo aggiunto da me
       public Object getValueAt(int r, int c)
       {
       return (String)cells[r][c];
       }
       //metodo aggiunto da me
       public String getColumnName(int c)
       {
       return columnsName[c];
       }
    
       // Chiude la connessione con il Database
       public void disconnetti() {
          try {
             db.close();
             connesso = false;
          } catch (Exception e) { e.printStackTrace(); }
       }
    
       public boolean isConnesso() { return connesso; }   // Ritorna TRUE se la connessione con il Database è attiva
       public String getErrore() { return errore; }       // Ritorna il messaggio d'errore dell'ultima eccezione sollevata
    }
    Mi potete dare un aiutinooo.

    Grazie fin da ora per le vostre risposte

  2. #2
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    JTable merita di essere approfondito un po' di più, comunque, brutalmente (se non hai particolari necessità) - e giusto per fare una prova (poi ti consiglio di andare a vedere TableModel, CellRenderer e quant'altro ti possa servire), potresti modificare un po' il metodo di LeleFT per restituire i dati di una query (la modifica è per pura pigrizia, per utilizzare un particolare costruttore di JTable)

    codice:
    public Vector eseguiQuery(String query) {
          Vector v = null;      
          int colonne = 0;
          try {
             Statement stmt = db.createStatement();     // Creo lo Statement per l'esecuzione della query
             ResultSet rs = stmt.executeQuery(query);   // Ottengo il ResultSet dell'esecuzione della query
             v = new Vector();
             rsmd = rs.getMetaData();
             colonne = rsmd.getColumnCount();
    //qualche modifica qui, in modo che si lavori su Vector piuttosto
    //che su String[]
             while(rs.next()) {   // Creo il vettore risultato scorrendo tutto il ResultSet
                Vector record = new Vector();
                for (int i=0; i<colonne; i++) {
                    record.add(rs.getString(i+1));
                }
                v.add(record);
             }
             rs.close();     // Chiudo il ResultSet
             stmt.close();   // Chiudo lo Statement
          } catch (Exception e) { e.printStackTrace(); errore = e.getMessage(); }
    
          return v;
       }
    per poi poter andare a costruire la tua JTable utilizzando il costruttore che prende due Vector come argomenti (uno con i nomi delle colonne, l'altro con i dati)

    codice:
    JTable table = new JTable(data, names);
    frame.getContentPane().add(new JScrollPane(table));
    Dove ovviamente frame sarà il tuo JFrame, JPanel o quant'altro dove andare a disegnare la tabella.
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  3. #3
    Come sempre sono utilissimi i tuoi consigli.

    Però quando mando in esecuzione la tabella visualizza solamente il primo campo della tabella.

    Cioè la tabella a me ha sei campi "CodiceArticolo" "Ingredienti";"Zuccheri"ecc ecc

    nella tabella viene visualizzato solamente la stringa di CodiceArticolo.

    Sicuramente devo fare un ciclo. Mi sai dire come posso ottenere il numero di colonne della tabella in modo da poter far visualizzare anche gli altri cmapi????

    Grazie come sempre

  4. #4
    Ciao scusami ancora ma ho risolto quel problemino. Era il vettore contenente l'intestazione della tabella che non era inizializzato correttamente.

  5. #5
    Ciao Andrea, grazie ancora una volta per la tua cortesia.

    Vorrei chiedere un'altra cosa, Adesso come risultato ho che la JTable da me create contiene tutti i record memorizzati nel database. E' possibile adesso selezionare una riga della tabella e inserire tutto il suo contenuto all'interno di un'altra tabella tramite drag & drop oppure tramite un pulsante????

    Grazie per il vostro aiuto.

    Saluti Michele

  6. #6
    Utente di HTML.it
    Registrato dal
    Aug 2002
    Messaggi
    8,013
    si può fare più o meno tutto quello che vuoi. Su una JTable puoi registrare parecchi listener... e senza complicarti la vita, con un opportuno MouseAdapter, potresti andare a verificare un evento quale double-click su una data cella ed eseguire una nuova query per estrarre gli ulteriori dati collegati a quella particolare cella. Per esempio:

    codice:
    private class MyTable extends JTable {
    
            private class MyMouseAdapter extends MouseAdapter {
    
                public void mouseClicked(MouseEvent me) {
                    MyTable t = (MyTable)me.getSource();
                    if (me.getClickCount() == 2) {
    // facciamo qualcosa... tu potresti ricavare il dato selezionato,
    // e lanciare una nuova query.
                        int row = t.rowAtPoint(me.getPoint());
                        int column = t.columnAtPoint(me.getPoint());
                        System.out.println("Hai clickato: ("+row+" ; "+column+")");
                    }
                }
            }
    
    // serve solo ad inibire la funzione "principe" del doppio click su una JTable, ovver
    // editare la cella target del doppio click.
            public boolean isCellEditable(int row, int column) {
                return false;
            }
    
            public MyTable(Vector v, Vector n) {
                super(v, n);            
                this.addMouseListener(new MyMouseAdapter());
            }
        }
    <´¯)(¯`¤._)(¯`»ANDREA«´¯)(_.¤´¯)(¯`>
    "The answer to your question is: welcome to tomorrow"

  7. #7
    Ciao, volevo sapere in merito al tuo ultimo post, ho modificato un p il mio codice ed ho visto che funziona tutto quello che mi hai suggerito di fare.

    Ma se io voglio che al doppio clik su di una riga mi venga restituita l'intera riga come faccio????

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.