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

    JAVA - inserire risultati Query DB in JTable

    salve a tutti
    premetto che sto iniziando a studiare l'interfacciamento tra java e mysql...
    ho scritto questo metodo che mi serve per collegarmi al DB, fare la query ed inserire i dati in una JTable, ma non riesco a capire come fare per indicare al programma in quale riga inserire i dati ricavati

    codice:
    public static void connettiAlDb() {
    		try {
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    		}
    		catch (Exception E) {
    			System.err.println("Impossibile caricare il driver");
    			E.printStackTrace();
    		}
    		try {
    			System.out.println("Connessione...");
    			Connection c = DriverManager.getConnection("jdbc:mysql://localhost/edicola?user=ilc0rv0");
    			System.out.println("Connesso: " + c);
    			Statement stmt = c.createStatement();
    			ResultSet res = stmt.executeQuery("SELECT * FROM quotidiani");
    			//int righe = res.getFetchSize();
    			JTable tabella = new JTable();
    			int i=0;
    			while (res.next()) {
    				tabella.setValueAt(res.getString("testata"),i,1);
    				tabella.setValueAt(res.getString("pr_netto"),i,2);
    				i++;
    			}
    		}
    		catch (SQLException E) {
    			System.out.println ("SQLException:  " + E.getMessage());
    			System.out.println ("SQLState:      " + E.getSQLState());
    			System.out.println ("VendorError:   " + E.getErrorCode());
    		}
    	}
    ottengo questo errore:
    Connessione...
    Connesso: com.mysql.jdbc.Connection@12b7eea
    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 1 >= 0
    at java.util.Vector.elementAt(Vector.java:431)
    at javax.swing.table.DefaultTableColumnModel.getColum n(DefaultTableColumnModel.java:277)
    at javax.swing.JTable.convertColumnIndexToModel(JTabl e.java:1680)
    at javax.swing.JTable.setValueAt(JTable.java:1794)
    at struttura.connettiAlDb(struttura.java:47)
    at struttura.main(struttura.java:18)
    la linea incriminata nel metodo connettiaAlDb č questa:
    tabella.setValueAt(res.getString("testata"),i,1);
    il metodo setValueAt() non va bene?
    qualcuno saprebbe aiutarmi?
    Grazie!

  2. #2
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    devi creare un array, vector o table model

    Vector cols = new Vector();
    cols.addElement("testata");
    cols.addElement("pr netto");
    Vector rows = new Vector();
    while (res.next()) {
    Vector vett = new Vector();
    vett.addElement(res.getString("testata"));
    vett.addElement(res.getString("pr_netto"));
    rows.addElement(vett);
    }
    JTable table = new JTable(rows, cols);

  3. #3
    ho modificato il metodo in questo modo (posto solamente la parte modificata):

    codice:
    try {
    			System.out.println("Connessione...");
    			Connection c = DriverManager.getConnection("jdbc:mysql://localhost/edicola?user=ilc0rv0");
    			System.out.println("Connesso: " + c);
    			Statement stmt = c.createStatement();
    			ResultSet res = stmt.executeQuery("SELECT * FROM quotidiani");
    			//----------------------------------------------------------
    			Vector cols = new Vector(); 
     			cols.addElement("testata"); 
     			cols.addElement("pr netto"); 
     			Vector rows = new Vector(); 
     			while (res.next()) {
     				Vector vett = new Vector(); 
     				vett.addElement(res.getString("testata")); 
     				vett.addElement(res.getString("pr_netto")); 
     				rows.addElement(vett); 
    			}
     			//---------------------------------------------------------------
    			JTable tabella = new JTable(rows, cols);
    		}
    ma ottengo questo errore:
    Connessione...
    Connesso: com.mysql.jdbc.Connection@12b7eea
    Exception in thread "main" java.lang.NullPointerException
    at java.awt.Container.addImpl(Container.java:621)
    at java.awt.Container.add(Container.java:307)
    at struttura.main(struttura.java:21)


    la linea 21 del main č questa:
    cont.add(tabella);

    cont č il container, praticamente quando attacco la tabella al container

  4. #4
    ho modificato il sorgente creando l'oggetto tabella nel main e dichiarando static i vettori rows e cols ed ora non mi da errori in compilazione, il problema č che mi si apre il frame senza niente dentro

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    import java.awt.Color.*;
    import java.net.*;
    import java.sql.*;
    import java.util.*;
    
    public class struttura extends JFrame
    {
    	private static JPanel tasti;
    	private static JTextArea tabella;
    	private static Vector cols, rows;
    	
    	public static void main(String[] args) {
    		JFrame f = new JFrame();
    		Container cont = f.getContentPane();
    		tasti = new JPanel();
    		
    		connettiAlDb();
    		JTable tabella = new JTable(rows, cols);
    		
    		tasti = new JPanel();
    		tasti.setLayout(new BorderLayout());
    		tasti.add(tabella, BorderLayout.NORTH);
    		
    		cont.add(tasti);
    		f.pack();
    		f.setDefaultCloseOperation(EXIT_ON_CLOSE);
    		f.show();
    	}
    	
    	public static void connettiAlDb() {
    		try {
    			Class.forName("com.mysql.jdbc.Driver").newInstance();
    		}
    		catch (Exception E) {
    			System.err.println("Impossibile caricare il driver");
    			E.printStackTrace();
    		}
    		try {
    			System.out.println("Connessione...");
    			Connection c = DriverManager.getConnection("jdbc:mysql://localhost/edicola?user=ilc0rv0");
    			System.out.println("Connesso: " + c);
    			Statement stmt = c.createStatement();
    			ResultSet res = stmt.executeQuery("SELECT * FROM quotidiani");
    			//----------------------------------------------------------
    			Vector cols = new Vector();
     			cols.addElement("testata");
     			cols.addElement("pr netto");
    			
     			Vector rows = new Vector();
     			while (res.next()) {
     				Vector vett = new Vector(); 
     				vett.addElement(res.getString("testata")); 
     				vett.addElement(res.getString("pr_netto")); 
     				rows.addElement(vett); 
    			}
    			
     			//---------------------------------------------------------------
    			
    		}
    		catch (SQLException E) {
    			System.out.println ("SQLException:  " + E.getMessage());
    			System.out.println ("SQLState:      " + E.getSQLState());
    			System.out.println ("VendorError:   " + E.getErrorCode());
    		}
    	}
    }

  5. #5
    Utente di HTML.it L'avatar di floyd
    Registrato dal
    Apr 2001
    Messaggi
    3,837
    sė ma rendere static campi e metodi che ti fanno comodo non č una soluzione
    forse č sbagliato pure che la classe del frame esegua la query
    sto parlando di concetti

  6. #6
    si, ma in realtā questa č semplicemente la prima prova che faccio per l'inserimento dei risultati di una query in una tabella

  7. #7
    ho risolto facendo cosi:

    codice:
    try {
    			System.out.println("Connessione...");
    			Connection c = DriverManager.getConnection("jdbc:mysql://localhost/edicola?user=ilc0rv0");
    			System.out.println("Connesso: " + c);
    			Statement stmt = c.createStatement();
    			ResultSet res = stmt.executeQuery("SELECT * FROM quotidiani");
    
    			Vector campi = new Vector();
     			cols.addElement("testata");
     			cols.addElement("pr netto");
    			
     			Vector testate = new Vector();
    			Vector prezzi = new Vector();
     			while (res.next()) {
     				testate.addElement(res.getString("testata"));
    				prezzi.addElement(res.getString("pr_netto"));
    				
    			}
    			tabella = new JTable(testate.size(),campi.size());
    			for(int i=0;i<testate.size();i++) {
    				tabella.setValueAt(testate.get(i),i,0);
    				tabella.setValueAt(prezzi.get(i),i,1);
    			}
    			
    		}

    come avevi scritto, mi inseriva in un unico campo sia il prezzo sia la testata del giornale (ma io non avevo specificato che mi servivano separati )
    il problema era che non mi creava la tabella usando il costruttore JTable(Vector a, Vector b), quindi ho provato a creare la tabella prendendo il numero di righe e colonne e poi le ho riempite (praticamente ho fatto come faccio quando programmo in PHP).
    ma il costruttore che mi avevi scritto tu, in teoria dovrebbe creare direttamente una tabelle con tutti i campi giā immessi, in modo da evitare il mio secondo for per inserirli?

  8. #8

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.