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

    [Java] Inserire dati da database in una JTable dinamica

    Ciao a tutti!
    Il mio problema è inserire in una JTable di due colonne("PRODOTTO", "QUANTITA'") , i dati presi da due colonne (nome, qta_contenuta) della tabella del database prodottomagazzino.

    Mi serve quindi una Jtable dinamica perchè posso inserire nuovi prodotti in prodottomagazzino.
    Il numero di righe che dovrei inserire nella JTable lo trovo ogni volta grazie a una select count.

    Potete spiegarmi dove sbaglio, cosa manca e perchè non riesco a vedere la tabella??
    ..ecco il codice..
    Grazie mille


    [ CODE]

    import java.awt.*;
    import java.awt.event.*;
    import java.sql.*;
    import java.util.StringTokenizer;
    import javax.swing.*;

    /*
    * To change this template, choose Tools | Templates
    * and open the template in the editor.
    */
    import javax.swing.table.AbstractTableModel;

    /**
    *
    * @author Mariuccia
    */
    public class Inventario extends JPanel{


    private JButton esci = new JButton("ESCI");

    private Statement st;
    private ResultSet rs;
    private Connection conn = Connessione.getConnessione();


    String [] tit = { "PRODOTTO", "QUANTITA'" };
    Object [][] dati;

    private MyTableModel modTab = new MyTableModel(dati, tit);
    private JTable tab = new JTable(modTab);
    private JScrollPane scrol = new JScrollPane();

    public String idR = File.IDristorante(); //trovo id ristorante
    private int codPro, codMag;
    private String temp = "";
    private String valore = "";
    private String temp2 = "";
    private int conta = 0;



    public Inventario() {
    initComponents();
    setBackground(Color.green);
    setLayout(null);

    }

    private void initComponents(){


    esci.setBounds(280,310,90,30);
    add(esci);
    esci.addActionListener(new Esci());

    scrol.getViewport().add(tab);
    scrol.setBounds(130,50,350,120);
    scrol.setAutoscrolls(true);
    add(scrol);


    Inserisci();

    }


    public int NumRighe(){
    //conto quante righe dovrò inserire nella mia tabella
    try{
    st = conn.createStatement();
    rs = st.executeQuery("select ID from magazzino where rist = '"+idR+"' ");

    while (rs.next()) {
    String tmp1 = rs.getString(1);
    codMag = Integer.parseInt(tmp1); //CodiceMagazzino
    }

    st = conn.createStatement();
    rs = st.executeQuery("select COUNT(*) from prodottomagazzino join contiene where idmag = '"+codMag+"' AND COD = codprod");
    while (rs.next()) {
    conta = Integer.parseInt( rs.getString(1));
    }
    }catch (SQLException sqle) {
    sqle.printStackTrace();
    }

    return conta;

    }

    //MODELLO MIA TABELLA
    class MyTableModel extends AbstractTableModel{

    private String[] title;
    private Object[][] celle;

    public MyTableModel(Object [][] d, String[] nome){
    title = nome;
    celle = d;
    }

    public Class getColumnClass(int colIndex){
    if(colIndex!=0) return String.class;
    else if(colIndex == 0) return String.class;
    else throw new RuntimeException();
    }

    public String getColumnName(int colIndex){
    return (String)title[colIndex];
    }

    public int getRowCount(){
    return NumRighe();
    }

    public int getColumnCount(){
    return title.length;
    }

    public Object getValueAt(int rowIndex, int colIndex){
    return celle[rowIndex][colIndex];
    }

    // public boolean isCellEditable(int rowIndex, int colIndex){
    // //metto le celle di tutte e 2 le colonne editabili:
    // //nella prima posso cancellare gli ingredienti che non voglio, nella seconda imposto le quantità
    // return colIndex >= 0;
    // }
    //
    // public void setValueAt(Object aValue, int rowIndex, int colIndex){
    // //per mantenere il valore che edito nella cella della tabella
    // celle[rowIndex][colIndex] = aValue;
    // }
    }



    public void Inserisci(){

    dati = new Object [NumRighe()][2];

    try{
    st = conn.createStatement();
    rs = st.executeQuery("select ID from magazzino where rist = '"+idR+"' ");

    while (rs.next()) {
    String tmp1 = rs.getString(1);
    codMag = Integer.parseInt(tmp1); //CodiceMagazzino
    }

    rs = st.executeQuery("select nome, qta_contenuta from prodottomagazzino join contiene where idmag = '"+codMag+"' AND COD = codprod");

    int i = 0;
    while (rs.next()) {

    dati[i][0] = rs.getObject("nome");
    dati[i][1] = rs.getObject("qta_contenuta");
    System.out.println(dati[i][0]);
    System.out.println(dati[i][1]);
    i++;

    }


    // while (rs.next()) {
    // temp = rs.getString("nome");
    // temp2 = rs.getString("qta_contenuta");
    // System.out.println(temp);
    // System.out.println(temp2);
    // }
    //

    // for( int r = 0; r <= NumRighe(); r++){
    // modTab.setValueAt(temp, r, 0);
    // tab.revalidate();
    // }
    // for( int r = 0; r <= NumRighe(); r++){
    // modTab.setValueAt(temp2, r, 1);
    // tab.revalidate();
    // }



    }catch (SQLException sqle) {
    sqle.printStackTrace();
    }
    }


    public class Esci implements ActionListener{
    public void actionPerformed(ActionEvent e){ } }

    }

    [/ CODE]

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] Inserire dati da database in una JTable dinamica

    Originariamente inviato da magapap
    Il mio problema è inserire in una JTable di due colonne("PRODOTTO", "QUANTITA'") , i dati presi da due colonne (nome, qta_contenuta) della tabella del database prodottomagazzino.

    Mi serve quindi una Jtable dinamica perchè posso inserire nuovi prodotti in prodottomagazzino.
    Il numero di righe che dovrei inserire nella JTable lo trovo ogni volta grazie a una select count.

    Potete spiegarmi dove sbaglio, cosa manca e perchè non riesco a vedere la tabella??
    Innanzitutto, dal punto di vista del "design", cerca di separare il più possibile la gestione della interfaccia, il modello della tabella, la gestione del database. Hai fatto una mega classe da 200 righe che fa tutto e di più .... separa ... incapsula il più possibile!!!

    Ma veniamo al problema della visualizzazione: all'inizio hai fatto

    codice:
        Object [][] dati;
      
        private MyTableModel modTab = new MyTableModel(dati, tit);
    Già qui non va bene. quella variabile di istanza 'dati' (che tra l'altro non è nemmeno private) inizialmente è null e tu stai passando al model un reference null.

    In getRowCount() invocare brutalmente NumRighe() che va a fare una query non è nemmeno il massimo!!

    Quando poi in Inserisci fai

    codice:
        public void Inserisci(){
            
            dati = new Object [NumRighe()][2];
    Tu stai assegnando un reference alla variabile 'dati', che non ha più nulla a che fare con il 'celle' nel tuo model. Insomma, non hai aggiornato nulla nel table model!!
    E se anche aggiornassi la variabile 'celle' nel table model, non basterebbe affinché la "view" della tabella venga aggiornata visivamente (per quello ci sono gli appositi metodi fireXXX).

    In definitiva ... mancano un po' di basi (sulla OOP in generale e sull'uso dei table model) e manca la conoscenza delle principali convenzioni per la scrittura dei sorgenti Java.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per avermi risposto lo stesso..
    Lo so che non so programmare in OOP....ma siccome questo è il massimo che so fare e devo concludere il progetto per forza, dopo settimane e settimane ho deciso di chiedere aiuto qui!

    'dati' inizialmente è null perchè non so quante righe ho nel database.
    Mi potresti spiegare come devo dichiarare dati, in modo che celle nel model sia compatibile?

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.