Pagina 2 di 4 primaprima 1 2 3 4 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 36
  1. #11
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Allora mi riferisco all'ultimo post...
    Ma tu permetti la selezione di celle singole? Io direi di permettere la selezione solo di una riga, per semplicità. Si fa così:
    codice:
    table.setRowSelectionAllowed(true);
    table.setColumnSelectionAllowed(false);
    table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    Qual'è la chiave della tua tabella? Il titolo? La colonna è la prima nella tabella?
    Se così è fai:
    codice:
    String key = (String) table.getModel().getValueAt(table.getSelectedRow(),1);
    mt.cancella(key);
    Il tuo metodo cancella(String key) deve fare semplicemente, con JDBC:
    codice:
    Connection conn = .... //la connessione con il DBMS
    String d = "DELETE FROM PRODOTTO WHERE TITOLO = ?"
    PreparedStatement ps = conn.prepareStatement(d);
    ps.setString(1, key);
    ps.executeUpdate();
    ps.close()
    gestendo tutte le eccezioni.

  2. #12
    Ciao signal, non so proprio come ringraziarti dell'aiuto che mi stai dando..

    cmq
    punto 1) sono d'accordo con te per la cancellazione di selezionare solo una riga.

    punto 2) table.setColumnSelectionAllowed(false);
    è importante mettere questa riga?
    non capisco perchè considerarla false.

    punto 3) table.setSelectionMode(ListSelectionModel.SINGLE_S ELECTION);
    qui devo permettere di fargli fare più selezioni perchè voglio fargli cancellare più righe alla volta.

    cosa imposto:
    questo
    ListSelectionModel.SINGLE_INTERVAL_SELECTION;

    oppure
    ListSelectionModel.MULTIPLE_INTERVAL_SELECTION;

    punto 4) Le chiavi della mia tabella sono (TITOLO E AUTORE) e (SUPPORTO E IDSUPPORTO):

    SONO COSì DISPOSTE

    COLONNA1 TITOLO(PRIMARIA), COLONNA2 AUTORE(PRIMARIA),
    COLONNA3 TIPOLOGIA(STRING), COLONNA4 DIMENSIONE(INT)
    COLONNA5 SUPPORTO(CHIAVE UNIQUE), COLONNA6 IDSUPPORTO(CHIAVE UNIQUE)


    quindi di conseguenza come modifico questa:

    String key = (String) table.getModel().getValueAt(table.getSelectedRow() ,1);

    ultimo punto)

    nel metodo cancella(String key)

    codice:
    Connection conn = .... //la connessione con il DBMS
    String d = "DELETE FROM PRODOTTO WHERE TITOLO = ?"
    PreparedStatement ps = conn.prepareStatement(d);
    ps.setString(1, key);
    ps.executeUpdate();
    ps.close()
    non capisco il ? dopo l'uguale, e ps.setString(1, key);

    Signal ti ho fatto un questionario eh eh, ma dopotutto mi stai facendo molte cose e mi stai insegnando molto.

    grazie di tutto, sei un amico!

  3. #13
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Il punto 2 è necessario, altrimenti puoi selezionare le colonne. Non ho capito una cosa: al punto 1 dici di voler cancellare solo una riga, ma poi al punto 3 vuoi permettere la selezione di più righe?!
    Se la chiave è (titolo,autore) allora prendi
    String titolo = (String) table.getModel().getValueAt(table.getSelectedRow() ,1);
    String autore = (String) table.getModel().getValueAt(table.getSelectedRow() ,2);
    e poi passa al metodo cancella entrambe le stringhe, oppure un oggetto di trasporto se ti è più comodo...
    Il ? è usato nei PreparedStatement: con ps.setString(1,key) dici all'oggetto ps di mettere al posto del primo ? la stringa key. Questo lo si fa principalmente per motivi di efficienza (caching delle query da parte del DBMS). Se sei a secco di questa parte di JDBC costruisciti la stringa da passare al driver manualemente: è uguale.

    P.S.: Prego :-)

  4. #14
    ciao signal, mi sono espresso male io, perchè quel dubbio che avevi: " al punto 1 dicevi di voler cancellare solo una riga, ma poi al punto 3 vuoi permettere la selezione di più righe?! " era riferito al "Ma tu permetti la selezione di celle singole? Io direi di permettere la selezione solo di una riga, per semplicità" .

    quindi per me andava bene selezionare l'intera riga, ma la cancellazione deve avvenire anche se una persona vuole cancellare più righe contemporaneamente..quindi la possibilità di selezionare più righe e cancellarle dal database.

    Il ? è usato nei PreparedStatement: non lo conoscevo perchè io stavo usando l'altro metodo,
    io non uso JDBC ma ODBC quindi non so se funziona lo stesso questo PreparedStatement.

    cmq al di la di tutto ho visto provando quello che mi hai postato che una riga mi da eccezione
    codice:
    if (o instanceof JButton) {
    			if(o==cancella){
    				
    					table.setRowSelectionAllowed(true);
    					table.setColumnSelectionAllowed(false);
    					table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
    				
    String key = (String) table.getModel().getValueAt(table.getSelectedRow(),1);//questa
    io ancora non invio niente all'altra classe che dovrebbe cancellare..

    quella riga mi da un eccezione di tipo:

    Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException:
    -1 ecc ecc.

    che può essere?
    ciao

  5. #15
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Ok, se vuoi permettere la selezione CONTIGUA di più righe usa:
    ListSelectionModel.SINGLE_INTERVAL_SELECTION
    altrimenti usa l'altra modalità.
    Le righe:
    table.setRowSelectionAllowed(true);
    table.setColumnSelectionAllowed(false);
    table.setSelectionMode(ListSelectionModel.SINGLE_S ELECTION);
    le devi mettere subito dopo la creazione della tabella, non all'interno del metodo che ti implementa l'azione. L'eccezione penso derivi dal fatto che table.getSelectedRow() restituisce -1 : questo avviene quando nessuna riga è selezionata. Devi fare un controllo...

  6. #16
    allora signal ti aggiorno, ho fatto finalmente le mie cancellazioni..
    ora volevo chiederti, una volta che ho cancellato una riga volevo aggiornare la JTable da un punto di vista visivo, quindi solo eliminando la riga selezionata, dato che nel db non ci sta più..
    c'è un modo per fare questo?
    ciao e grazie

  7. #17
    ma come si fa sto benedetto refresh della JTable..
    io per gestire la JTable mi sono creato una classe:

    class MyTableModel extends AbstractTableModel

    ora se io voglio cancellare una riga che devo fare, visto che non posso usare removeRow(i) del modello DefaultModel, opure ci sta un modo..

    ciao e grazie

  8. #18
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Ricrea il modello con i nuovi dati, e usa il metodo setModel(TableModel model) sulla tabella.

  9. #19
    ciao signal, aspè detto così non si capisco molto..
    ti posto il codice e tu dimmi cosa faresti..

    questa è la classe che mi gestisce il modello
    codice:
    	class MyTableModel extends AbstractTableModel {
    		
    	private TableColumn column = null;
    	private Object[][] data;//matrice di oggetti
            private String[] columnNames = {"Titolo", // titoli delle colonne
                                            "Autore",
                                            "Tipologia",
                                            "Nome file",
                                            "Mb",
                                            "Supporto",
                                            "Indice",
                                            "Commenti"};
                   
    	public MyTableModel(){
    		
    		
    		
    		temp =mt.trova();//metodo che mi raccoglie i dati dopo una query al DB
    		data=new Object[temp.length][8];
    		
    		for(int i=0;i<temp.length;i++){
    			
    			
    			
    		data[i][0]=temp[i].getTitolo();
    			data[i][1]=temp[i].getAutore();
    				data[i][2]=temp[i].getTipologia();
    					data[i][3]=temp[i].getNome_file();
    						data[i][4]=temp[i].getDimensione();
    						    data[i][5]=temp[i].getSupporto();
    						        data[i][6]=temp[i].getIdsupporto();
    						             data[i][7]=temp[i].getCommento();
    		
    					                  
    }
    
    }
    
    
            public int getColumnCount() {
               return columnNames.length;
            }
    
            public int getRowCount() {
                return data.length;
            }
    
            public String getColumnName(int col) {
                return columnNames[col];
            }
    
            public Object getValueAt(int row, int col) {
                return data[row][col];
            }
    e questo è l'action listener che gestisce il pulsante "cancella" dopo che seleziono le righe.

    codice:
    if (o instanceof JButton) {
    			if(o==cancella){
    				
    				try{
    					if(table.getSelectedRow()==-1){//se non hai selezionato niente
    					JOptionPane.showMessageDialog(null,"Non hai selezionato niente", "Attenzione",JOptionPane.ERROR_MESSAGE);
    					}else{
    				        int temp[] = table.getSelectedRows();//creo l'array delle righe selezionate
    					
    					int i=0;
    					
    					while (i<temp.length){
    						String titolo = (String)table.getValueAt(temp[i],0);
    						String autore = (String)table.getValueAt(temp[i],1);
    						String tipologia = (String) table.getValueAt(temp[i],2);
    					        String nome_file = (String) table.getValueAt(temp[i],3);
    				                int dimensione = (Integer)table.getValueAt(temp[i],4);
    				     	        String supporto = (String) table.getValueAt(temp[i],5);
    					        String idsupporto = (String) table.getValueAt(temp[i],6);
    					        String commento = (String) table.getValueAt(temp[i],7);
    						
    				VoceDistributore v=new VoceDistributore(titolo,autore,tipologia,nome_file,dimensione,supporto,idsupporto,commento);
    				
    					    mt.cancella(v); //chiamo il metodo per la cancellazione sul db che funziona
    					    
    				
    						i++;
    					
    					}
    					
    						
    				}
    				
    			}
    				catch(VoceAssente e){
    									
    					
    					JOptionPane.showMessageDialog(null,"Non esiste l'oggetto selezionato", "Attenzione",JOptionPane.ERROR_MESSAGE);
    	
    				
    				}
    			}
    ecco come faresti adesso a fare il refresh della tabella partendo da questa situazione..
    usando quel setModel che mi dicevi..
    ciao e grazie

  10. #20
    Utente di HTML.it
    Registrato dal
    Jul 2007
    Messaggi
    28
    Ho dato un'occhiata veloce... Potresti creare all'interno del metodo actionPerformed il nuovo modello per la tabella:
    model = new MyTableModel();
    poiché questo esegue una query avrà i dati relativi alla tabella, ora priva delle righe cancellate. Poi fai:
    table.setModel(model);
    validate();
    Dovrebbe andare...

    Comunque ti consiglio di non eseguire accessi al DB dai metodi che gestiscono gli eventi: questi infatti vengono eseguiti in threads che dovrebbero, in linea di principio, eseguire task brevi.

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 © 2026 vBulletin Solutions, Inc. All rights reserved.