Rendere un DefaultTableModel editabile a runtime

di il
2 risposte

Rendere un DefaultTableModel editabile a runtime

Ciao a tutti,
ho un problemuccio che mi sta dando i nervi
Creo una tabella da gui di netbeans e poi la riempio andando a creare un modello e assegnando un vector. A questo punto se clicco la tabella contenente i dati non è più editabile a runtime, io vorrei renderla editabile tramite un menu, qualcuno sa darmi una dritta?

Grazie anticipate a chiunque voglia provarci

2 Risposte

  • Re: Rendere un DefaultTableModel editabile a runtime

    Di default una tabella che ha un DefaultTableModel come modello è editabile, devi aver fatto qualcosa tu per disattivare questa caratteristica (se stai usando quello come da titolo, la superclasse AbstractTableModel invece di default non consente di modificare le celle), in genere lo si fa con l'override del metodo di DefaultTableModel, facendo sempre un return false all'interno ...

    Comunque se vuoi rendere la tabella editabile o meno a runtime è sufficiente usare proprio questo metodo: puoi creare una classe che estende DefaultTableModel (o anche AbstractTableModel, ma devi ridefinire molti più metodi) e fare l'override di isCellEditable, ritornando il valore di una variabile booleana memorizzata all'interno della classe.
    Ti basta quindi inserire un metodo setter per modificare il valore di questa variabile dall'esterno per fare quello che vuoi a runtime.

    Posto sotto un codice di esempio con un checkbox che rende il modello editabile/non editabile. In questo scenario il valore vale per l'intera tabella. Se vuoi avere alcune celle editabili e altre no la cosa è abbastanza più complicata.
    Nota che potresti anche rendere la tabella non editable utilizzando semplicemente table.setEnabled (false), ma è una cosa diversa, ti impedisce anche di selezionare le righe della tabella e per alcuni look and feel (forse) potrebbe anche cambiarne l'aspetto.
    import java.awt.BorderLayout;
    import java.awt.event.ItemEvent;
    import java.awt.event.ItemListener;
    import javax.swing.JCheckBox;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.table.DefaultTableModel;
    public class ToggleEditableModel
    {
    	public static void main (String [] a) {
    		SwingUtilities.invokeLater (new Runnable () {
    			@Override public void run () {
    				createAndShowGUI ();
    			}
    		});
    	}
    	private static void createAndShowGUI () {
    		JFrame frame = new JFrame ("Toggle Editable Model");
    		frame.setDefaultCloseOperation (JFrame.EXIT_ON_CLOSE);
    		frame.setContentPane (new MainPanel ());
    		frame.pack ();
    		frame.setLocationRelativeTo (null);
    		frame.setVisible (true);
    	}
    }
    class MainPanel extends JPanel
    {
    	public MainPanel () {
            super (new BorderLayout ());
    		// Table Data
    		Object [][] data = {
    			{ "Kathy", "Smith" },
    			{ "John", "Doe" },
    			{ "Sue", "Black" },
    			{ "Jane", "White" },
    			{ "Joe", "Brown" }
            };
    		String [] columnNames = { "First Name", "Last Name", "# of Years", "Vegetarian" };
    		// Table Model and table
    		ToggleModel model = new ToggleModel (data, columnNames);
    		JTable table = new JTable (model);
            add (new JScrollPane (table), BorderLayout.CENTER);
    		// Checkbox
    		JCheckBox checkBox = new JCheckBox ("Editable Model", true);
    		checkBox.addItemListener (new ItemListener () {
    			@Override public void itemStateChanged (ItemEvent e) {
    				model.setEditable (e.getStateChange () == ItemEvent.SELECTED);
    			}
    		});
    		add (checkBox, BorderLayout.SOUTH);
        }
     
        class ToggleModel extends DefaultTableModel
    	{
    		private boolean editable;
    		
            public ToggleModel (Object [][] data, String [] columnNames) {
    			super (data, columnNames);
    			this.editable = true;
    		}
    		
    		@Override public boolean isCellEditable (int row, int column) {
    			return editable;
    		}
    		
    		public void setEditable (boolean editable) {
    			this.editable = editable;
    		}
            
        }
    }
  • Re: Rendere un DefaultTableModel editabile a runtime

    Grazie mille per il tuo supporto,
    alla fine ho optato per rifare la tabella in modo da permettere l'edit e poi ho innescato il controllo sul menu di salvataggio, puoi modificare la tabella ma se non hai il permesso non puoi salvare.
    Comunque la tua soluzione funziona.
    Grazie ancora
    Ciao
Devi accedere o registrarti per scrivere nel forum
2 risposte