Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132

    [JAVA] Rendere una colonna di una tabella di jtable editabile

    Ciao a tutti.

    Ho risolto in parte i miei problemi precedenti lasciando perdere NetBeans.

    Ho creato una tabella che visualizza i risultati di una query.

    In sostasta ho creato una classe FileTableModel che estende AbstractTableModel

    e poi creo una tabella usando questo modello in questa maniera:

    codice:
    TableModel fileTable = new FileTableModel("file");
    JTable table = new JTable(fileTable);
    come posso ora rendere le celle di una colonna editabili??

    Grazie mille!

    mainetz.

  2. #2
    ciao, è sufficiente creare il seguente metodo nel tuo FileTableModel nel quale specifichi quale colonna può essere editata:
    codice:
    public boolean isCellEditable(int row, int column) {
            return (column != 2);
          }
    in questo esempio tutte le colonne presenti, al di fuori della terza, sono editabili

  3. #3
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Esatto!!!!!

    GRAZIE MILLEEEEEEEEEEEEEEEEEE!!!

    Ora però ho un problema... Ci clicco posso modificarlo ma appena lo modifico e clicco enter torna al vecchio valore...

    Cmq ti spiego un po' più approfonditamente cosa devo fare.

    Ho una tabella che si popola da una query di un database. Devo visualizzare il risultato della query (e fino a qui ce l'ho fatta) in 2 colonne (una con il nome e una contenente un boolean) devo poter modificare la cella del valore booleano.

    Ho visto usando netbeans che è possibile creare una cella con una checkbox che se il valore è true è spuntato e se è false non è spuntato (ovvio!!) e se clicco sulla cella (non necessariamente nel quadratino della checkBox) cambia il valore della checkBox.

    Mi sai aiutare anche in questo?

    Grazie mille!

    mainetz.

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,325
    Beh... dovresti, quantomeno, postare il codice del tuo TableModel.

    Per applicare le modifiche al modello (ciò che contiene i dati) devi aver ridefinito il metodo setValueAt() in modo che vada a modificare i dati e richiami il metodo fireTableCellUpdated().

    Oltretutto, devi tenere presente che se i dati provengono da un DB e il tuo scopo è quello di modificare i dati nel DB, dovrai essere tu a generare la query opportuna da eseguire sul DB ad ogni modifica.


    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

  5. #5
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Grazie mille per gli aiuti!

    Sono riuscito a fare quello che mi avete detto!!!

    L'unica cosa che mi manca è adesso la sincronizzazione con il db.

    Vorrei fare una cosa di questo genere. Ogni volta che clicco su una checkBox per abilitarla/disabilitarla si aggiunge ad una stringa (o ad un arrey di stringhe) l'id del file da settare a true o ad un altro arrey per settarla a false (controllando che non sia nell'altro arrey) e poi alla pressione del pulsante OK posto alla fine della pagina viene fatto l'update.

    L'unica cosa che non so come fare è il capire che la cella è stata è modificata e come...

    Riporto qui sotto il codice della mia TableModel:

    codice:
    package myPack;
    
    import javax.swing.table.*;
    import java.sql.ResultSet;
    
    public class FileTableModel extends AbstractTableModel {
    	
    	private String[] columnNames;
    	private Object[][] cells;
    	private Database db;
    	
    	
    	public FileTableModel(String aTableName){
    		
    		  int rowCount; // Il numero di record presenti nella tabella
    		  String query; // La query creata per accedere al database
    		  
    		  this.db = new Database("sf_data","root","ernesto");
    		  db.connetti(); //Apre la connesione al database
    		  query = "SELECT link_file,usato FROM " + aTableName;
    		  
    		  
    		  try{
    			  
    			  rowCount = db.getRecordCount(aTableName); // Recupero il numero di record nella tabella
    			  columnNames = db.getColumnsName(aTableName); // Recupero le intestazioni delle colonne
    			  cells = new Object[rowCount][columnNames.length]; //Creo la matrice dei dati
    			  
    			  ResultSet rs = db.resultSetQuery(query); //eseguo la query
    			  
    			  int counter = 0;
    			  
    			  //carico la matrice dei dati
    			  while(rs.next()){
    				  for(int i=0; i<columnNames.length; i++)
    					  cells[counter][i] = rs.getObject(i+1);
    				  counter++;
    			  }
    
    			  
    		  }catch(Exception e){e.printStackTrace();}
    
    		
    	}
    	
    	public int getRowCount() {
    		return cells.length;
    	}
    
    	public int getColumnCount() {
    		return columnNames.length;
    	}
    
    	public Object getValueAt(int r, int c){
    		return cells[r][c];
    	}
    
    
    	public String getColumnName(int c){
    		return columnNames[c];
    	}
    	
    	public boolean isCellEditable(int row, int column) {
            return (column != 0);
          }
    	
        public Class getColumnClass(int c) {
            return getValueAt(0, c).getClass();
        }
    
    	
        public void setValueAt(Object value, int row, int col) {
        	
        	cells[row][col] = value;
            fireTableCellUpdated(row, col);
    
        }
    
    
    	
    }

    Grazie ancora per l'aiuto!

    Ciao.

    mainetz.

  6. #6
    non riesco a capire cosa vuoi fare, potresti spiegarti meglio?

  7. #7
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Grazie a tutti per il contributo ce l'ho fatta!!!!

    Dovevo solamente aggiungere questo metodo al mio file table model:

    codice:
        public void upDateDb(Object value, int row){
        	
        	
        	if((Boolean)value == true){
        		String file = (String)getValueAt(row,0);
        		if(fileFalse.contains(file)){
        			fileFalse.removeElement(file);
        		}
        		fileTrue.add(file);
        	}
        	if((Boolean)value == false){
        		String file = (String)getValueAt(row,0);
        		if(fileTrue.contains(file)){
        			fileTrue.removeElement(file);
        		}
        		fileFalse.add(file);
        	}
    
        	
        }
    Dove fileTrue e fileFalse sono 2 vector.

    Il metodo viene richiamato all'interno di:

    codice:
        public void setValueAt(Object value, int row, int col) {
        	
        	cells[row][col] = value;
            fireTableCellUpdated(row, col);
            upDateDb(value,row);
            
        }
    Ora avrei un altra domanda ma credo sia meglio aprire una nuova discussione perchè c'entra poco con questo titolo!

    Ciao a tutti!

    E grazie mille!

    mainetz.

  8. #8
    Utente di HTML.it L'avatar di mainetz
    Registrato dal
    Oct 2003
    Messaggi
    132
    Ovviamente un grazie speciale a sicenti e a LeleFT!!!

    Ciao.

    mainetz!

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.