Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [Java] JTable e le celle editabili

    codice:
    package Componenti;
    
    import java.awt.BorderLayout;
    
    import java.util.ArrayList;
    
    import javax.swing.ImageIcon;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.table.AbstractTableModel;
    
    	public class IGAppuntamenti extends JFrame 
    	{
    	    private ModelloTab modelloTab;
    	    private JTable table;
    	    private JScrollPane scrollPane;
    	    private ArrayList<Appuntamento> listaApp;
    
    	    public IGAppuntamenti(ArrayList<Appuntamento> listaApp) 
    	    {
    	        super ("Elenco Appuntamenti");
    	        setDefaultCloseOperation (JFrame.DISPOSE_ON_CLOSE);
    	        setSize(450, 350);
    	        setVisible(true);
    	        
    	        
    	        modelloTab = new ModelloTab(listaApp);
    	        table = new JTable(modelloTab);
    	        scrollPane = new JScrollPane(table);
    	        getContentPane().add(scrollPane, BorderLayout.CENTER);
    	    }
    	
    	class ModelloTab extends AbstractTableModel
    	{
    		private ArrayList<Appuntamento> listaAppuntamenti;
    		
    		public ModelloTab(ArrayList<Appuntamento> listaApp)
    		{
    			this.listaAppuntamenti=listaApp;
    		}
    		
    		/**Metodo che ritorna il numero di colonne che uso*/
    		public int getColumnCount()
    		{
    			return 6; 
    		}
    
    		/**Metodo che ritorna il numero di righe utilizzate*/
    		public int getRowCount()
    		{
    			return listaAppuntamenti.size(); // in base al numero di elementi nell'arraylist
    		}
    
    		/**Metodo che ritorna l'oggetto presente nella cella indicata dalle coordinate row e col*/
    		public Object getValueAt(int row, int col)
    		{
    		 Appuntamento app = listaAppuntamenti.get(row);
    		 switch (col) 
    		 {
    	      case 0: return app.getData().getDataCompleta();
    	      case 1: return app.getOra().getDataCompleta();
    	      case 2: return app.getDescrizione(); 
    	      case 3: return app.isAlarm();
    	      case 4: return createImage();
    	      case 5: return createImage();
    		 }
    		 return null;
    		}
    
    		/**Metodo che ritorna un'immagine*/
    	    private ImageIcon createImage() 
    	    {
    	        ImageIcon icon = new ImageIcon("image/a.jpeg");
    	        return icon;
    	    }
    	    
    		/**Meotodo che ritorna in base al numero della colonna passatogli, i titoli delle colonne*/
    		public String getColumnName(int column) 
    	    {
    	        switch (column) 
    	        {
    	            case 0: return "Data";
    	            case 1: return "Ora";
    	            case 2: return "Descrizione";
    	            case 3: return "Allarme?";
    	            case 4: return "Modifica";
    	            case 5: return "Cancella";
    	        }
    
    	        return ""; // caso default che non si verifica mai se strutturo bene lo switch
    	    }
    		
    		
    		/**Metodo che ritorna la classe di cui è composta ogni colonna*/
    	    public Class getColumnClass(int column) 
    	    {
    	        switch (column) 
    	        {
    	            case 0: return String.class;
    	            case 1: return String.class;
    	            case 2: return String.class;   
    	            case 3: return Boolean.class;   // il renderer/editor di default per Boolean mostra un "checkbox"
    	            case 4: return ImageIcon.class;  
    	            case 5: return ImageIcon.class;  
    	        }
    	        return Object.class; // caso default che non si verifica mai se strutturo bene lo switch
    	    }
    	    
    	    /**Metodo che mi permette di rendere editabili soltanto alcune celle. */
    	    public boolean isCellEditable(int row, int col) 
    	    {
    	        return col ==3;   // in questo caso rendo editabile solo la colonna 3 infatti ritorno true quando column=3
    	    }
    	}
    }
    Salve a tutti. Posto qui il codice che ho e la mia domanda: Come mai la cella 3 contenente il "checkbox" non riesco a farla diventare editabile?
    Ho seguito l'esempio fatto da andbin (http://forum.html.it/forum/showthrea...ghlight=Jtable) ma non riesco a capire dove abbia toppato.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] JTable e le celle editabili

    Originariamente inviato da Raziel86
    Come mai la cella 3 contenente il "checkbox" non riesco a farla diventare editabile?
    isCellEditable è corretto e anche il ritorno di Boolean.class per la colonna 3 da getColumnClass è il modo giusto.

    Ma il punto è che se vuoi poter cambiare effettivamente lo stato del checkbox (cioè che il cambiamento persista), devi implementare anche il setValueAt, che per la colonna 3 riceverà un Boolean che dovrai impostare, si presume dal codice, nella proprietà "alarm" dell'oggetto Appuntamento alla riga i-esima.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Grazie per la risposta andbin.

    Io sto provando a cercar di capire come funziona il metodo set che hai postato nel tuo esempio ma non capisco.
    Potresti gentilmente esplicarmelo con qualche commento?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Raziel86
    Io sto provando a cercar di capire come funziona il metodo set che hai postato nel tuo esempio ma non capisco.
    Di quale esempio parli? Di quello che avevo postato nella discussione che hai indicato sopra? Quello era un esempio per un "renderer" custom (e molto particolare oltretutto) ma non era un esempio sui table model!

    Nel tuo ModelloTab devi semplicemente implementare il metodo:

    public void setValueAt(Object aValue, int rowIndex, int columnIndex) { ..... }

    Questo viene invocato principalmente da JTable (quando l'editing in una cella termina e bisogna aggiornare il model) ma anche da qualunque altro codice che ha accesso diretto al model e ha qualche interesse a settare una cella.

    Nel setValueAt generalmente si fanno 2 cose:
    1) Si aggiorna la struttura dati nel punto relativo alla cella in rowIndex/columnIndex
    2) Si invoca uno dei fireXXX ereditati da AbstractTableModel, visto che in genere cambia una sola cella, si usa fireTableCellUpdated(int row, int column)
    Questo serve per notificare ai TableModelListener registrati che "qualcosa" è cambiato.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Si, mi riferisco all'esempio che hai postato quella volta e che ho linkato nel thread.

    Devo anche dire che se prima avevo qualche dubbio ora sono in mezzo all'oceano e vedo solo acqua intorno a me.

    Faccio un passo indietro e mi cerco qualche manuale che mi spieghi da 0 le regole che si applicano al JTable e compagnia bella perchè nonostante le tue risposte e la documentazione ufficiale, è peggio che andar di notte.

    Grazie ancora.

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Raziel86
    Si, mi riferisco all'esempio che hai postato quella volta e che ho linkato nel thread.
    Sì ma ripeto che in quell'esempio non c'era alcun table model specifico ... solo un esempio (e pure particolare) di un TableCellRenderer. E non è quello che ti serve.

    Originariamente inviato da Raziel86
    Devo anche dire che se prima avevo qualche dubbio ora sono in mezzo all'oceano e vedo solo acqua intorno a me.
    Ma hai fatto il 99% .... ti manca, lo ripeto, solo il setValueAt.

    Il isCellEditable che hai fatto è corretto e indica a JTable che la colonna indice 3 è "editabile". Vuol dire che quando ci clicchi sopra, JTable attiva l'editor (che fornisce un JCheckBox per via del Boolean.class da getColumnClass) ma affinché lo stato true/false possa essere "persistente", il model deve poter ricevere il valore.

    Ed è a questo che serve il setValueAt.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

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.