Newsgroup: it.comp.java
Titolo: Jdbc -> JTable : Non mi stampa l'ultimo riga  con i dati inseriti..

Ho trovato un esempio sulla stampa del contenuto di una tabella di un
db su una JTable. L'ho adattato al mio progetto da consegnare x l'esame
ma..
mi stampa la prima riga vuota e non mi stampa la riga contenente
l'ultimo inserimento effettuato.
il risultato nella jtable è:
___________________________________
campo1 | campo2 | campo3 | campo 4 |
-----------------------------------
 vuoto |  vuoto |  vuoto |  vuoto |
-----------------------------------
datook | datook | datook | datook |
-----------------------------------
datook | datook | datook | datook |
-----------------------------------
datook | datook | datook | datook |
-----------------------------------
il codice invece è il seguente:
----------------------------------------------------------
package esame;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionListener;
import javax.swing.event.ListSelectionEvent;
import javax.swing.JScrollPane;
import javax.swing.JPanel;
import javax.swing.JFrame;
import java.sql.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.table.TableColumn;
import javax.swing.*;
public class EsploraLogVisuale extends JFrame {
    private boolean ALLOW_COLUMN_SELECTION = false;
    private boolean ALLOW_ROW_SELECTION = true;
    JTable table;
    Object [][] data;
    String[] columnNames;
    public EsploraLogVisuale() {
        super("Salvataggio Dati Inseriti");
        riempi();
        table = new JTable(data,columnNames);
        TableColumn column = null;
        for (int i = 0; i < columnNames.length; i++) {
             column = table.getColumnModel().getColumn(i);
             column.setMinWidth(70);
             }
        table.setPreferredScrollableViewportSize(new Dimension(500,
270));
        table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
        JScrollPane scrollPane = new JScrollPane(table);
        getContentPane().add(scrollPane, BorderLayout.CENTER);
        addWindowListener(new WindowAdapter()
        		{
        	public void windowClosing(WindowEvent e){
        		//System.exit(0);
        		}
        	});
        }
 public void riempi () {
 Connection con=null;
 try {
     Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
     con=DriverManager.getConnection("jdbc:odbc:;DRIVER=Microsoft
Access Driver (*.mdb);DBQ=c:/temp/mydb.mdb","","");
     Statement statement=con.createStatement();
     ResultSet rs = statement.executeQuery("select count(*) from
salvataggi");
     int rows = 0;
     while (rs.next()) { rows = rs.getInt(1); }
     rs.close();
     System.out.println(rows);
     rs = statement.executeQuery("select * from salvataggi");
     ResultSetMetaData meta = rs.getMetaData();
     int columns = meta.getColumnCount();
     System.out.println(columns);
     columnNames = new String[columns];
     data = new Object [rows][columns];
     int j;
     for (j=1;j<=columns;j++)
         { columnNames[j-1] = meta.getColumnLabel(j);
         System.out.println(j+" "+meta.getColumnClassName(j));
         }
     int cont=0;
     while (rs.next()) {
                       cont++;
                       for (j=1;j<=columns;j++)
                           { data[cont][j-1]=rs.getString(j); }
                       System.out.println(cont+" "+data[cont][2]);
                       }
     rs.close();
     con.close();
     }
 catch (SQLException sqle) {
	 System.out.println("2"+sqle.getMessage()); }
	      catch (ClassNotFoundException cnfe) {
	 System.out.println("3"+cnfe.getMessage()); }
	      catch (Exception e) { System.out.println("4"+e.getMessage()); }
	 }
	      public static void main(String[] args) {
	         EsploraLogVisuale frame = new EsploraLogVisuale();
	         frame.pack();
	         frame.setVisible(true);
	         }
	  }
-----------------------------------------------------------
Qualcuno sa dirmi dov'è l'inghippo? :|

 l'ultimo inserimento effettuato.
A occhio, senza averci studiato dietro troppo, direi che:
   int cont=0;
   while (rs.next()) {
     cont++;
       for (j=1;j<=columns;j++)
         { data[cont][j-1]=rs.getString(j); }
Il primo valore di cont nel loop e' 1, e quindi accede a data[1] e non a 
data[0].
Ah, potresti ottimizzare molto facendo una sola query e al posto di 
inizializzare "data" con dimensioni fisse, usare un ArrayList di ArrayList.
Piu' o meno cosi' (Non testato):
   rs = statement.executeQuery("select * from salvataggi");
   int columns = rs.getMetaData().getColumnCount();
   ArrayList data = new ArrayList();
   while(rs.next()) {
     ArrayList column = new ArrayList();
     for (int j = 0; j < columns; j++) {
       column.add(rs.getString(j));
     }
     data.add(column);
   }
-- 
Giambo - Occhio al filtro antispam _e_ alla whitelist !