Pagina 1 di 4 1 2 3 ... ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 36
  1. #1

    JTable e database

    salve ragazzi, allora sono riuscito a fare una query in un database access e a farmi ricomparire i dati in una JTable..
    ho due domande, del tipo, come si fa...

    1)a cancellare una riga del db selezionando la riga della JTable?

    2)a modificare una riga del db modificando la riga della JTable?

    l'inserimento già l'ho fatto ed è realizzato in un altro modo, perchè non c'entra niente con la JTable.

    grazie in anticipo.

    ciao

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Supponendo che tu stia usando JDBC, la cosa più comoda è usare un updatable ResultSet, con cui puoi fare inserimenti, aggiornamenti e cancellazioni attraverso un ResultSet passando per la JTable.
    Ottieni un updatable ResultSet dalla connessione conn così:
    codice:
     
    Statement stat
       = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE,
          ResultSet.CONCUR_UPDATABLE);
    Ad esempio per fare un aggiornamento sul prezzo di un libro in una tabella Books:
    codice:
    String query = "SELECT * FROM Books";
    ResultSet rs = stat.executeQuery(query);
    while (rs.next())
    {
       if (. . .)
       {
          double increase = . . .
          double price = rs.getDouble("Price");
          rs.updateDouble("Price", price + increase);
        rs.updateRow();
      }
    }
    Tu devi usare opportunamente il modello della tua JTable cosicché i dati da aggiornare/cancellare passino da questa al ResultSet che essa rappresenta.

  3. #3
    ciao signal, grazie intanto per avermi risposto, però non ci capisco più di tanto..
    mi spiego meglio..

    Io ho fatto una classe GUIDistributore che mi gestisce la grafica del programma,
    in fase di creazione della JTable

    JTable table=new JTable(new MyTableModel), avviene la chiamata alla classe interna

    class MyTableModel extends AbstractTableModel

    perchè deve ricevere nella sua matrice, i dati che sono passati dalla Classe DistributoreDB(la classe che si occupa di fare le query verso access).

    quindi fino a qui funziona tutto..cioè avvio il programma ed immediatamente mi escono i risultati a video nella mia tabella.

    ora facciamo per esempio il caso della cancellazione, quindi, io seleziono la riga o metto un segno di spunta accanto alla tabella, non so, poi clicco sul pulsante cancella e quella riga deve sparire dal database e naturalmente dalla tabella

    sto complicando le cose?
    ciao

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Mmh non so se Access supporta gli updatable ResultSet. Però potresti ricavare le chiavi dalle righe selezionate nella JTable e cancellare le corrispondenti entry nella tabella di Access: poi ricarichi il modello della JTable con i nuovi dati.

  5. #5
    Beh di sicuro che Access supporta gli updatable ResultSet non lo so nemmeno io..
    però l'idea che hai avuto e cioè, ricavare le chiavi dalle righe selezionate nella JTable e cancellare le corrispondenti entry nella tabella di Access e poi ricaricare il modello della JTable con i nuovi dati, va bene.
    quindi io dovrei ricavare queste chiavi, dalla JTable della classe GUIDistributore e mandare alla classe DistributoreDB(che si occupa di fare le query) queste chiavi.

    solo che signal io è la prima volta che lavoro con una JTable quindi non so neanche come ottenere le chiavi di una riga..

    scusami ma voglio imparare qualcosina e con la documentazione della sun non ci capisco molto.

    ciao

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Allora il metodo getSelectedRow() invocato sulla tabella ti restituisce l'indice della riga attualmente selezionata (oppure se si consente all'utente di selezionare un insieme di righe si usa getSelectedRows() che restituisce un array di indici): supponiamo essa sia la j-esima. Supponiamo inoltre che la colonna che contiene la chiave sia la i-esima, allora invochi sulla tabella getModel().getValueAt(i,j) e ciò restituisce l'oggetto in posizione (i,j) nella JTable. Se la chiave è spalmata su più colonne o se devi operare su più righe iteri il tutto. Spero di essere stato chiaro...

  7. #7
    allora vedi se ho capito..
    Mi trovo nella classe GUIdistributore che gestisce l'interfaccia grafica.

    1): al click sul pulsante "cancella" gestisco l'evento
    codice:
    public void actionPerformed(ActionEvent ae) {
    Object o=ae.getSource();
    if (o instanceof JButton) {
    	if (o==cancella) {//se il tasto premuto è cancella
    	VoceDistributore voceSelezionata = table.getSelectedRow();
    /*ottengo la riga e la metto in una variabile di tipo VoceDistributore(è una classe che raccoglie le varie voci)*/
    	mt.cancella(voceSelezionata);//passo la riga alla classe DistributoreDB(che mi fa la query) //richiamando il metodo cancella
    				
            }
    è corretto?
    ciao

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Ad alto livello sì, ma ci sono errori. Il metodo getSelectedRow() restituisce un intero, che come detto corrisponde alla riga selezionata nella tabella, quindi non puoi fare:
    VoceDistributore voceSelezionata = table.getSelectedRow();
    Devi invece usare:
    int selectedRow = table.getSelectedRow();
    Object key = table.getModel().getValueAt(selectedRow,j);
    per prendere la chiave, che ho supposto corrisponda alla colonna j. Il metodo getValueAt() restituisce un oggetto, quindi ti serve un cast. Poi passi la chiave al metodo che ti interagisce con il DBMS, ad esempio con:
    mt.cancella(key);

  9. #9
    Allora signal ti ringrazio perchè mi stai facendo capire delle cose ma mi stanno venendo dubbi su altre.

    La mia tabella è fatta così, ti faccio un esempio:

    TITOLO(string), AUTORE(string), DIMENSIONE(int)

    photoshop adobe 600 mega

    se io devo cancellare la riga basta che faccio

    int selectedRow = table.getSelectedRow();
    Object key = table.getModel().getValueAt(selectedRow);
    mt.cancella(key);//richiama il metodo della classe DistributoreDB

    quindi non considero la colonna, (o forse non si fa perchè getValueAt vuole sia riga che colonna),

    e nella classe DistributoreDB ci sarebbe
    DELETE FROM PRODOTTO WHERE ID = key
    e mi cancella la riga.

    se sopra ho sparato solo scemenze forse dovrei fare così:

    int selectedRow = table.getSelectedRow();//prendo la riga

    int selectedColumn = table.getSelectedColumn();//prendo la colonna
    Object key = table.getModel().getValueAt(selectedRow,selectedCo lumn);//mi prende l'oggetto riga colonna es. photoshop
    mt.cancella(key);//richiama il metodo della classe DistributoreDB

    ma poi in DistributoreDB quando faccio
    DELETE FROM PRODOTTO WHERE .........(come faccio a fargli capire che deve cancellare quella riga dove ci sta photoshop?)

    perchè potrei avere più titoli con lo stesso nome..

  10. #10
    allora io non ci capisco più niente eh eh, qua prova e prova partono solo eccezioni..

    se io ho la mia JTable fatta così, esempio:

    TITOLO(string), AUTORE(string), DIMENSIONE(int)

    photoshop--------adobe-------- 600 mega

    poi faccio click sulla cella dove ci sta scritto photoshop
    poi clicco sul pulsante cancella che viene gestito così:
    codice:
    	public void actionPerformed(ActionEvent ae) {
    		Object o=ae.getSource();
    		if (o instanceof JButton) {
    			if(o==cancella){
    				
    				try{
    				int selectedRow = table.getSelectedRow();
    		
    				int selectedColumn = table.getSelectedColumn();//prendo la colonna
                    Object key = table.getModel().getValueAt(selectedRow,selectedColumn);
                    mt.cancella(key);//richiama il metodo della classe DistributoreDB
    				}
    				catch(VoceAssente e){					
    					
    					JOptionPane.showMessageDialog(null,"errore", "Attenzione",JOptionPane.ERROR_MESSAGE);
    	
    				
    				}
    			}
    ecco facendo così che sto passando alla classe DistributoreDB, l'oggetto key che contiene la stringa "photoshop"?

    ciao

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.