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

    AbstractTableModel Diabolico

    Buonasera a tutti
    Avevo gia precedentemente postato un messaggio inerente il riempimento di una semplice tabella; in seguito mi sono resa conto che per rendere le celle non editabili sarei dovuta ricorrere all'AbstractTableModel; ho preparato quindi un esempio per tenatare di farvi capire ciò che voglio fare:
    codice:
    public class ProvaTab extends JPanel implements ActionListener{
    	JTable table;
    	JScrollPane scroll;
    	JButton carca;
    	
    	public ProvaTab() {
    		   this.setLayout(null);
    		   this.setBounds(0,0,1000,600);
    		   this.setBackground(Color.cyan);
    		   carca = new JButton("butta su");
    		   carca.setBounds(10, 10, 100, 20);
    		   carca.addActionListener(this);
    		   this.add(carca);
    		   table = new JTable(new Model());
    		   scroll = new JScrollPane(table);
    		   scroll.setBounds(50, 50, 700, 400);
    		   this.add(scroll);
    	}
    	
    class Model extends AbstractTableModel {
    	String[] Colonne = {"Nome","Cognome","Contratto","NumTelefono"};
    	Object[][] Dati = {};//Inizialmente vuota, i dati verranno aggiunti al click sui bottoni
    		
    	    public int getColumnCount() {
    	        return Colonne.length;
    	    }
    	    public int getRowCount() {
    	        return Dati.length;
    	    }
    	    public String getColumnName(int col) {
    	        return Colonne[col];
    	    }
    	    public Object getValueAt(int row, int col) {
    	        return Dati[row][col];
    	    }
    	    public boolean isCellEditable(int row, int col) {
    	    	return false;
    	    }
    
    	}
    	
    	void caricaLista() {
    	 //che devo scrivere qui per far riempire la tabella con qualsiasi dato o stringa?	 
    }
    	
    	public void actionPerformed (ActionEvent e) {
    		 Object src = e.getSource();
    		 if (src==carca) {
    			 caricaLista();
    		 }
    	 }
    	
    public static void main (String[] args) {
    		JFrame frame = new JFrame();
    		ProvaTab prova = new ProvaTab();
    		frame.setBounds(240, 200, 1000, 600);
    		frame.add(prova);
    		frame.setLayout(null);
    		frame.setVisible(true);
    		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    	}
    
    }
    Ora avrei qualche dubbio:
    1) Come posso aggiungere/cancellare gli elementi dalla mia tabella?? Quali metodi devo utilizzare??
    2) Come mai se scrivo table.addRow eclipse mi diche che quel metodo non esiste mentre nel sito della sun viene elencato tra i metodi dell'AbstractTableModel

    Vi pregherei di farmi qualche esempio e di non reindirizzarmi al tutorial della sun, lo ho gia consultato e li gli elementi vengono inseriti in tabella SOLO al momento dell'inizializzazione... praticamente è inutile...

    P.S. La mia tabella dovrà contenere solo elementi di tipo String ma è importante che le celle non siano editabili: se conoscete un TableModel migliore o un metodo piu efficiente per creare una tabella che risponda a tali requisiti vi sarei grata se me lo diceste.
    Grazie infinite

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

    Re: AbstractTableModel Diabolico

    Originariamente inviato da Alessia88web
    in seguito mi sono resa conto che per rendere le celle non editabili sarei dovuta ricorrere all'AbstractTableModel
    Beh no, non necessariamente. Se ti bastasse la struttura dati di un DefaultTableModel (Vector di Vector di oggetti che è appunto espandibile) potresti fare una piccola sottoclasse di DefaultTableModel per fare l'override solo di isCellEditable() affinché ritorni sempre false.

    Originariamente inviato da Alessia88web
    Ora avrei qualche dubbio:
    1) Come posso aggiungere/cancellare gli elementi dalla mia tabella?? Quali metodi devo utilizzare??
    2) Come mai se scrivo table.addRow eclipse mi diche che quel metodo non esiste mentre nel sito della sun viene elencato tra i metodi dell'AbstractTableModel

    Vi pregherei di farmi qualche esempio
    Allora potresti guardare l'esempio completo che avevo postato qui
    E se hai altri dubbi, chiedi pure.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Ho visto il tuo esempio ed ora ho piu dubbi di prima..
    1) Utilizzando questo infernale AbstractTableModel devo crearmi da sola i metodi per manipolare i dati all'interno della tabella (intendo aggiungere togliere ecc..)?

    2) Non c'è uno stramaledetto modello di tabella che abbia tali metodi di default e che possa rendere le celle non editabili?

    3) Per quale maledetto motivo posso aggiungere elementi a Object[][] Dati solo in fase di inizializzazione? Esempio:
    codice:
    class Model extends AbstractTableModel {
    	String[] Colonne = {"Nome","Cognome","Contratto","NumTelefono"};
    	Object[][] Dati = {};//Inizialmente vuota, i dati verranno aggiunti al click sui bottoni 
    ........
    Ora se metto un metodo "custom" come hai fatto tu che mi consenta di aggiungere dati a quell'oggetto:
    codice:
    public void aggiorna() {
    //che diamine devo scrivere qui per aggiungere dati a quell'oggetto? vorrei inserire il primo utente Es: Dati = {{"Java","èUnaSola","PerFaUnaTabellaBisognaBastonare","LaCroce"}};
    }
    Ovviamente non funziona potreste dirmi anche a parole come posso risolvere questo problema?
    Grazie mille

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da Alessia88web
    1) Utilizzando questo infernale AbstractTableModel devo crearmi da sola i metodi per manipolare i dati all'interno della tabella (intendo aggiungere togliere ecc..)?
    Sì, esatto. Proprio come DefaultTableModel che offre metodi del tipo: addRow(), insertRow(), removeRow() ecc.... che non centrano nulla con la interfaccia del model. Sono in più e potrebbero essere con qualunque nome.

    Se per esempio il tuo table model è "modellato" per gestire una lista di oggetti Persona (es. con ArrayList<Persona>) potresti mettere un metodo addPersona(Persona p).
    Insomma .... i metodi che vuoi "offrire" per la modifica dei dati li devi implementare .

    Originariamente inviato da Alessia88web
    2) Non c'è uno stramaledetto modello di tabella che abbia tali metodi di default e che possa rendere le celle non editabili?
    Il nocciolo della editabilità è solo nel isCellEditable().
    AbstractTableModel lo implementa per ritornare sempre false, DefaultTableModel lo implementa per ritornare sempre true.

    Tu hai la opportunità di fare l'override e ritornare quello che vuoi ... fisso o determinato in base a riga/colonna.

    Originariamente inviato da Alessia88web
    3) Per quale maledetto motivo posso aggiungere elementi a Object[][] Dati solo in fase di inizializzazione? Esempio:
    codice:
    class Model extends AbstractTableModel {
    	String[] Colonne = {"Nome","Cognome","Contratto","NumTelefono"};
    	Object[][] Dati = {};//Inizialmente vuota, i dati verranno aggiunti al click sui bottoni 
    ........
    Gli array non sono ridimensionabili. Come hai fatto sopra, hai istanziato un array vuoto. Se vuoi gestire tu la espansione si può fare ma dovresti fare concettualmente proprio quello che fanno ArrayList e altri basati su array.
    Cioè istanziare un array più grande, assegnare il nuovo reference al campo di istanza e quindi scrivere i dati della riga.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok ok ci sono quasi (nel senso che inizio a capirci qualcosa :berto: )!
    Daccordo ora stò tentando di utilizzare gli ArrayList! posto la classe relativa al modello della tabella:
    codice:
    class Model extends AbstractTableModel {
    		String[] Colonne = {"Nome","Cognome","Contratto","NumTelefono"};
    		ArrayList<String> Dati = new ArrayList<String>();
                      
                      public Model() {
    	    }
    
    	public int getColumnCount() {
    	        return Colonne.length;
    	    }
    	public int getRowCount() {
    	        return Dati.size();
    	    }
    	public String getColumnName(int col) {
    	        return  Colonne[col];
    	    }
    	public Object getValueAt(int row, int col) {
    	        return getValueAt(row, col);
    	    }
    	public boolean isCellEditable(int row, int col) {
    	    	return false;
    	    }
    Ora io vorrei che al click su di un bottone il programmino mi inserisse una riga nella tabella con all'interno scritto un nome a caso un cognome a caso ecc...
    Io ho provato a fare cosi:
    codice:
    (Il metodo è dentro alla classe Model ed è collegato al bottone)
    public void caricaLista() {
    	    int row = Dati.size() -1;
    	    Dati.add("Gino");
                     Dati.add("Paoli");
                     Dati.add("Tim");
                     Dati.add("33333333");
    	    fireTableRowsInserted(row, row);
    Ottengo come risultato un errore "java.lang.StackOverflowError at getValueat" in compenso se riduco a icona la finestra del programma e la riapro compaiono sulla tabella tante righe BIANCHE (vuote senza nulla scritto all'interno) quanti sono i click effettuati sul bottone... è gia una soddisfazione..

    Potresti essere cosi gentile da modificare il mio codice affinchè riesca ad eseguire questo semplice comando??
    Grazie infinite

  6. #6
    Si in effetti ho ripetuto il getValueat dentro se stesso e non ha nessun senso... Non so come fare ad implementarlo, spero tu mi dia una mano
    Grazie ancora

  7. #7
    Ok ci sono riuscita!!! Ho copiato il tuo codice e lo ho fatto girare con eclipse e lo ho spulciato ben bene! per il momento riesco a visualizzare la tabella e ad aggiungere stringhe negli opportuni campi!

    Spero di poter contare ancora su di voi!
    Grazie a tutti

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.