Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 24
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168

    Risultato query su più jtable

    Ciao!
    Facendo una query sul DB ottengo vari record.

    Io vorrei inserire questi record su una o più jtable a seconda della prima colonna del risultato.

    Mi spiego meglio con un esempio!

    La query mi restituisce:
    1 paperino
    1 pluto
    2 paperina
    3 pippo

    io vorrei, in base a questo, creare 3 jtable:
    - jtable1 che contiene: paperino, pluto
    - jtable2 che contiene: paperina
    - jtable3 che contiene: pippo

    Come potrei fare?
    Grazie in anticipo

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Ps: ho già creato il mio tableModel per inserire i risultati della query nelle jtable...
    l'unica cosa è che non riesco a creare più jtable e a suddividere le righe come ho scritto sopra!

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Nessuno che mi dia una mano?

  5. #5
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Se hai 3 JTable, avrai 3 istanze di TableModel. Non capisco la difficoltà: quando scorri il ResultSet, fai i test che ti servono e, a seconda del risultato del test, aggiungi il record al TableModel corretto.


    codice:
    // Supponendo che il tuo table-model si chiami "TuoModel"
    TableModel model1 = new TuoModel();   // Table-model per la prima JTable
    TableModel model2 = new TuoModel();   // Table-model per la seconda JTable
    TableModel model3 = new TuoModel();   // Table-model per la terza JTable
    
    JTable table1 = new JTable( model1 );
    JTable table2 = new JTable( model2 );
    JTable table3 = new JTable( model3 );

    Ho creato 3 JTable, ciascuna col suo Table-Model. Ora, quando scorri i dati, vai ad aggiungere i record al TableModel corretto:


    codice:
    // Suppongo che la classe che modella il singolo record si chiami "TuoRecord"
    ResultSet rs = ...;   // Esegui la query
    if (rs != null) {
       while( rs.next() ) {
          TuoRecord record = creaRecordDaResultSet( rs );   // o qualsiasi altra cosa che ti restituisca l'oggetto TuoRecord
          int tipoRecord = rs.getInt( 1 );   // Prendo il primo campo, che mi dice il tipo di record
          switch( tipoRecord ) {
             case 1:   // Il record va nella prima JTable
                model1.add( record );
                break;
    
             case 2:   // Il record va nella seconda JTable
                model2.add( record );
                break;
    
             case 3:   // Il record va nella terza JTable
                model3.add( record );
                break;
          }
       }
    }

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Il problema è che io non so a priori il risultato della query, quindi nemmeno quante jtable devo creare...

    Una volta eseguita la query devo cercare di leggere il risultato e in base a quello creare il numero giusto di jtable e 'smistare' i record!

  7. #7
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Allora fatti un array di table model in base al risultato della query
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2014
    Messaggi
    168
    Allora questo è il mio codice per ottenere il modello dal risultato della query:

    codice:
           public TableModel_ModificaScheda getLista(Integer id) throws DAOException {
                 TableModel modello = new MyModel();
                
                 try {
                        conn = getConnection(usr, pass);
                        ps = conn.prepareStatement(getListaQuery);
                        ps.setInt(1, id);
                        rs = ps.executeQuery();
                       
                        int cMax = rs.getMetaData().getColumnCount();
                        modello.setColumnCount(cMax);
                       
                        // Prima riga vuota per impostare i nomi delle colonne
                        for(int c = 0; c < cMax; c++) {
                               if(c == 0){
                                      modello.setRowCount(modello.getRowCount() + 1);                           }
                 }
                       
                 while (rs.next()) {
                              
                        int riga = modello.getRowCount(); 
                              
                        for(int c = 0; c < cMax; c++) {
                               if(c == 0){
                                      modello.setRowCount(modello.getRowCount() + 1);                                 }
                                     
                               Integer idAssociato = rs.getInt(1);
                               String nome = new String(rs.getString(2));
                                     
                               Object[] valore = new Object[]{idAssociato, nome};
                                     
                               modello.setValueAt(valore[c], riga, c);
                        }
                 }
                 } catch (ConnectionException e) {
                        throw new DAOException("Errore in connessione DB");
                 } catch (SQLException e) {
                        throw new DAOException("Errore in select SQLException.");
                 }
                 return modello;
           }
    In un'altra classe creavo poi una jtable passandogli questo modello.

    Adesso immagino di dover fare:

    codice:
           public List<TableModel_ModificaScheda> getLista(Integer id) throws DAOException {
                 List<TableModel> modello = new ArrayList<MyModel>();
           ………………
    Giusto?
    Poi rs.getInt(1) per leggere la prima colonna... e poi?
    Io non so a priori cosa c'è scritto nella prima colonna... non per forza c'è scritto 1,2,3...
    ci sta anche che mi esce:
    - 34 pippo
    - 35 pluto
    - 35 topolino
    - 36 paperino
    - 37 paperina
    - 37 archimede

    In questo caso ad esempio devo creare 4 modelli (da passare poi a 4 jtable diverse)...

  9. #9
    Utente di HTML.it L'avatar di Alex'87
    Registrato dal
    Aug 2001
    residenza
    Verona
    Messaggi
    5,802
    Fai una select count distinct sulla prima colonna, in questo modo sai quante sono...
    Ma non ti serve neanche saperlo in realtà:

    Man mano che leggi dal result set potresti mettere in una mappa (ad esempio, Map<Integer, List<String>> map) in questo modo:

    codice:
    if (!map.containsKey(id_associato)) {
        map.put(id_associato, new ArrayList<String>());
    }
    map.get(id_associato).add(nome);
    Poi hai tutte i dati raggruppati e per ogni entry puoi creare un table model e una jtable. Può andare?
    SpringSource Certified Spring Professional | Pivotal Certified Enterprise Integration Specialist
    Di questo libro e degli altri (blog personale di recensioni libri) | ​NO M.P. TECNICI

  10. #10
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Ok, allora il problema va affrontato in modo più generale (pensavo i valori fossero fissi).
    Crea una HashMap in cui vai a mappare ciascun valore contenuto nella prima colonna con un TableModel:


    codice:
    HashMap<Integer, MioModel> mappaModel = new HashMap<Integer,MioModel>();

    Per ciascun record, prendi il valore della prima colonna e controlla se esiste già una mappatura. Se esiste la mappatura, prelevi il table-model associato e ci aggiungi il record, se non esiste, crei un nuovo table-model e crei la mappatura:


    codice:
    while( rs.next() ) {
       int tipoRecord = rs.getInt( 1 );
       if ( mappaModel.containsKey(tipoRecord) ) {
          // Esiste già la mappatura: aggiungo il record al relativo TableModel
          Record record = ... ;   // Crei l'oggetto dal ResultSet
          MioModel model = mappaModel.get( tipoRecord );
          model.add( record );
       } else {
          // Non esiste alcuna mappatura, la creo e ci aggiungo il record
          Record record = ... ;   // Crei l'oggetto dal ResultSet
          MioModel model = new MioModel();
          model.add( record );
          mappaModel.put(tipoRecord, model);
       }
    }

    Ora hai tutti i TableModel, ciascuno contenente i record corrispondenti. Non ti rimane che creare le JTable di conseguenza:


    codice:
    // Dovrò creare esattamente "mappaModel.size()" JTables...
    JTable[] tabelle = new JTable[ mappaModel.size() ];
    int idx = 0;
    for(Map.Entry<Integer,MioModel> entry : mappaModel.entrySet()) {
       tabelle[idx] = new JTable( entry.getValue() );
       idx++;
    }

    Fatto. Ora aggiungi tutte le tabelle al tuo container.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

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.