Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 17
  1. #1

    [Java] Problema iterazione su Object[]

    sto cercando di riemire una JTable prendendo i dati da un metodo che esegue una query su db:
    codice:
        public Object[] select() throws ClassNotFoundException, SQLException, IOException {
            ArrayList<String> list = null;
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getBook() }");
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                list = new ArrayList<String>();
                list.add(String.valueOf(rs.getInt("book_id")));
                list.add(rs.getString("title"));
                list.add(rs.getString("author_name"));
                list.add(rs.getString("editor_name"));
                list.add(String.valueOf(rs.getDouble("price")));
                list.add(rs.getString("isbn"));
                list.add(rs.getString("note"));
    //            ((MyTableModel) PanelTable.getTable().getModel()).addRow(list.toArray());
            }
            cstmt.close();
            return list.toArray();
        }
    il metodo ritorna un Object[].
    nel JPanel ho un JButton con questo evento:
    codice:
        private void btnConnectActionPerformed(java.awt.event.ActionEvent evt) {                                           
            try {
                MyTableModel newModel = (MyTableModel) tableData.getModel();
                while (newModel.getRowCount() > 0) {
                    newModel.removeRow(0);
                }
    
                for (int i = 0; i < dbman.select().length; i++) {
                    ((MyTableModel) tableData.getModel()).addRow(dbman.select());
                }
            } catch (IOException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            } catch (SQLException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            } catch (ClassNotFoundException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
        }
    il problema è che la JTable viene riempita con solo 5 righe mentre dovrebbero essere 107.
    inoltre i valori sono sempre gli stessi.
    penso che sto sbagliando nel modo di iterare ma le ho provate un pò tutte.
    MyTableModel è un table model che estende DefaultTableModel.
    il metodo addRow richiede un Object[].

  2. #2
    forse ho capito dov'è il problema ma nn so come risolverlo.
    nel while(rs.next()) io istanzio un nuovo oggetto ArrayList<String>.
    ogni oggetto corrisponde ad una riga della jtable.
    così facendo però io nn nn ritorno tutti gli oggetti list creati.
    se è questo è il problema nn so come risolverlo

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il metodo deve tornare per forza un Object[]?

    E poi, scritto in questo modo non ha molto senso direi... Non ha senso scorrere tutte le righe nel db, e far tornare un array; e successivamente nell'altro metodo inserire la chiamata a select() in un ciclo for...

  4. #4
    diciamo che la chiave sta tutta qua:
    codice:
    ((MyTableModel) tableData.getModel()).addRow(Object[]);
    il metodo addRow richiede un Object[].
    in pratica l'array corrisponde ad una riga; o meglio ogni riga della JTable è un array.
    quindi io devo fare in modo di estrapolare ogni record del ResultSet e passarlo ad addRow.
    il metodo select() a sto punto tornare quello che vuole, solo che nn saprei cosa.
    se guardi la riga commentata del metodo si capisce meglio il discorso.
    ad ogni ciclo del while istanzio un nuovo ArrayList<String>(), e ci metto dentro i valori di rs.
    ogni ArrayList<String>() corrisponde ad una riga della JTable che do in pasto ad addRow.
    lo faccio ad ogni ciclo però.
    se invece volessi evitare di richiamare la JTable qua e di passargli tutti i valori?
    lo so che nn ha senso itererare su select(), il problema è che nn mi viene in mente altro.
    in select() devo salavre ogni riga del ResultSet e passarlo ad addRow nell'evento.
    nn so se mi sono spiegato meglio.

  5. #5
    l'unico modo che mi è venuto in mente è di passare il ResultSet e poi di eseguire il while nel JPanel.
    ma nn penso sia una buona pratica di programmazione.

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Che addRow() richiede un Object[] lo so pure io... mi riferivo al metodo select().

    Quindi ricapitolando: tu hai un JPanel che contiene il bottone e che genera un evento; questo codice deve riempire la tabella. Per effettuare questa operazione richiami select() che è in un'altra classe e che deve riempire la tabella in JPanel.

    Al momento della creazione di questo oggetto (della classe con select()) che parametri passi al costruttore?
    Potresti passare il tuo table model e lasciare che sia poi select() a riempirlo. Oppure nella classe del JPanel tieni un indice che viene incrementato e che indichi l'indice della riga del db da leggere.
    Oppure ancora, potresti continuare a ciclare in select() e riempire Object[][] con tutte le righe; ma ogni riga sarà un nuovo Object[].

    Ecco un esempio... ogni array Object[] corrisponde ad una riga, ed ovviamente l'array che ritorna dal tuo select() deve essere a 2 dimensioni (una matrice).

    codice:
    class Prova {
      public static void main(String[] args) {
        Object[] riga1 = {"Uno","Due","Tre"};
        Object[] riga2 = {"Quattro","Cinque","Sei"};
        Object[] riga3 = {"Sette","Otto","Nove"};
        
        Object[][] array = {riga1, riga2, riga3};
        
        // Questa la lettura
        for(int i=0; i<array.length; i++) {
         // Ogni elemento di array corrisponde ad una riga
          Object[] temp = array[i];
          for(int j=0; j<temp.length; j++) {
            System.out.println(temp[j]);
          }
          System.out.println();
        }
      }
    }

  7. #7
    il problema di un array bidimensionale di Object è che io nn so a priori quante righe siano.
    quindi il metodo select mi dovrebbe riportare sia il numero di righe che il valroe per ogni riga:
    codice:
        public Object[][] select() throws ClassNotFoundException, SQLException, IOException {
            ArrayList<String> list = null;
            Object[][] matrice = null;
            int count = 1;
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getBook() }");
            ResultSet rs = cstmt.executeQuery();
            while (rs.next()) {
                count++;
                list = new ArrayList<String>();
                list.add(String.valueOf(rs.getInt("book_id")));
                list.add(rs.getString("title"));
                list.add(rs.getString("author_name"));
                list.add(rs.getString("editor_name"));
                list.add(String.valueOf(rs.getDouble("price")));
                list.add(rs.getString("isbn"));
                list.add(rs.getString("note"));
                matrice = {};
    //            ((MyTableModel) PanelTable.getTable().getModel()).addRow(list.toArray());
            }
            cstmt.close();
            return matrice;
        }
    ovviamente questo è sbagliato.
    il mio problema è che nn so come passare il numero di righe in Object[][].

  8. #8
    pensavo di fare così.
    nel metodo select():
    codice:
        public Object[][] select() throws ClassNotFoundException, SQLException, IOException {
            ArrayList<String> list = null;
            Object[][] matrice = null;
            Object[] count;
            conn = DBManager.getInstance().takeConnection();
            CallableStatement cstmt = conn.prepareCall("{ CALL getBook() }");
            ResultSet rs = cstmt.executeQuery();
            rs.last();
            count = new Object[rs.getRow()];
            rs.first();
            while (rs.next()) {
                list = new ArrayList<String>();
                list.add(String.valueOf(rs.getInt("book_id")));
                list.add(rs.getString("title"));
                list.add(rs.getString("author_name"));
                list.add(rs.getString("editor_name"));
                list.add(String.valueOf(rs.getDouble("price")));
                list.add(rs.getString("isbn"));
                list.add(rs.getString("note"));
                matrice = new Object[][]{count, list.toArray()};
    //            ((MyTableModel) PanelTable.getTable().getModel()).addRow(list.toArray());
            }
            cstmt.close();
            return matrice;
        }
    poi nel JPanel:
    codice:
                Object matrice[][] = dbman.select();
                for (int i = 0; i < matrice.length; i++) {
                    Object[] temp = matrice[i];
                    for (int j = 0; j < temp.length; j++) {
                        ((MyTableModel) tableData.getModel()).addRow(temp[j]); // ERRORE
                    }
                }
    solo che mi da errore alla riga indicata:
    codice:
    error: no suitable method found for addRow(Object)
    come se nn riconoscesse temp come array.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    No, perchè non è un array in quel modo. Un array a 2 dimensioni è un array di array.

    matrice deve essere istanziata una volta sola. All'interno del ciclo metti un array, che verrà creato ogni volta; prima di essere distrutto, quindi al termine della riga, lo aggiungi alla matrice.

    Qui una domanda... perchè non utilizzare Vector<E>?

    codice:
        Vector<Vector<String>> elementi = new Vector<Vector<String>>();
        
        Vector<String> riga1 = new Vector<String>();
        riga1.add("Primo");
        riga1.add("Secondo");
        riga1.add("Terzo");
        
        Vector<String> riga2 = new Vector<String>();
        riga2.add("Quarto");
        riga2.add("Quinto");
        riga2.add("Sesto");
        
        elementi.add(riga1);
        elementi.add(riga2);
        
        for(int i=0; i<elementi.size(); i++) {
          model.addRow(elementi.get(i));
        }
    Se potessi, semplificheresti enormemente il lavoro e le problematiche...

  10. #10
    si in effetti potrei anche usare un Vector come dici.
    ma rimane cmq un problema.
    nel tuo esempio crei:
    Vector<String> riga1 = new Vector<String>();
    Vector<String> riga2 = new Vector<String>();
    Vector<String> riga3 = new Vector<String>();
    .........

    io nn so a priori quante righe ci siano.
    come faccio a dirglielo?

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.