Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1

    Velocizzare metodo popolamento JTable

    Salve ragazzi,

    avrei un dubbio da togliermi.

    Allora ho una applicazione java con swing.

    In una schermata estra l'elenco completo degli articoli, e inserisce questi dati in un mio tablemodel.

    La prima soluzione che avevo creato era fare una query con tutti i dati che mi servivano e metterla in un tablemodel che estendeva Abstracttablemodel, senza andare a ridefinire un mio metodo getValueAt.

    Con questa soluzione, lanciavo la query che mi ritornava un Vector di Stringhe.

    Soluzione veloce ma si perde tutta la logica degli oggetti.

    Seconda soluzione

    Creo una query che mi restituisce un vector di Articoli che contengono tute le info relative all'articolo.

    Ridefinisco un mio tableModel che estende defAULTTABLEMODEL.
    Ora per far apparire i dati a video ho creato un metodo stampaTabella che altro non fa che questo

    codice:
    public void stampaTabella(Vector<Articoli> v){
       for(Iterator it = v.iterator; it.hasnext();){
    Articoli art= it.next;    
    super.setvalueAt(art.getcodice; riga, 0);
    .........
    ..........
    ..........
    .......
       }
    }
    soltanto che quando tento di aprire la pagina, mentre prima ci metteva meno di un secondo ora impiega 6 7 secondi prima che mi venga mostrata la pagine secondo voi può essere colpa del metodo stampaTabella????

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

    Re: Velocizzare metodo popolamento JTable

    Originariamente inviato da bircastri
    Seconda soluzione

    Creo una query che mi restituisce un vector di Articoli che contengono tute le info relative all'articolo.

    Ridefinisco un mio tableModel che estende defAULTTABLEMODEL.
    Ora per far apparire i dati a video ho creato un metodo stampaTabella che altro non fa che questo

    soltanto che quando tento di aprire la pagina, mentre prima ci metteva meno di un secondo ora impiega 6 7 secondi prima che mi venga mostrata la pagine secondo voi può essere colpa del metodo stampaTabella????
    Se lavori già "ad oggetti" cioè manipoli un insieme di oggetti di un certo tipo, allora:
    1) fai un tuo table model es. ArticoliTableModel che estende AbstractTableModel (la gestione della struttura dati quindi è a tuo carico ma banalmente può essere una lista di Articolo) con tutti i metodi gestiti appropriatamente.
    2) nel tuo table model rendi disponibile all'esterno un nuovo metodo pubblico es. setListaArticoli, internamente va semplicemente ad aggiornare la struttura dati e poi invoca uno dei fireXXX per la notifica (ti dico subito quale è: se aggiorni tutto, è il fireTableDataChanged() ).

    Questo è il modo "pulito" per farlo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Quindi allora visto che io ho una lista o vector di Articoli, devo crearmi come ho mostrato prima un metodo non so stampa tabella che mi va a stampare tutto il vettore nella tabella è corretto?
    altrimenti puoi fare un esempio che non ho ben capito

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da bircastri
    Quindi allora visto che io ho una lista o vector di Articoli, devo crearmi come ho mostrato prima un metodo non so stampa tabella che mi va a stampare tutto il vettore nella tabella è corretto?
    altrimenti puoi fare un esempio che non ho ben capito
    codice:
    public class ArticoliTableModel extends AbstractTableModel {
        private List<Articolo> listaArticoli;
    
        //....... costruttore/i, metodi per soddisfare/gestire il table model, ecc...
    
        public void setListaArticoli(List<Articolo> nuovaListaArticoli) {
            // qui aggiorni la struttura dati e fai il fireTableDataChanged()
        }
    
        // Altri eventuali metodi per lavorare "ad oggetti" es.
        //    public void aggiungiArticolo(Articolo a)
        // oppur es.
        //    public void rimuoviArticolo(int riga)
        // ecc....
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Ok allora il mio talbeModel è già così, quello che non capisco è come fa lui dopo che faccio il setLista a visualizzare a video le info che io desidero.

    per caso lo fa il metodo fireTableDataChanged che io andrò a sovrascrivere?

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da bircastri
    Ok allora il mio talbeModel è già così, quello che non capisco è come fa lui dopo che faccio il setLista a visualizzare a video le info che io desidero.

    per caso lo fa il metodo fireTableDataChanged che io andrò a sovrascrivere?
    codice:
    public void setListaArticoli(List<Articolo> nuovaListaArticoli) {
        // aggiorna la struttura dati, banalmente potrebbe essere una copia del riferimento (non è il massimo a livello concettuale)
        listaArticoli = nuovaListaArticoli;
    
        // fire evento
        fireTableDataChanged();
    }
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    ciao io ho fatto cos'ì ma non funziona

    codice:
    public MyClass(){
    		JPanel panel1 = new JPanel();
    		Dimensione dimensioneComponenti = new Dimensione();
    		Dimension d2 = new Dimension();
    		d2.setSize(dimensioneComponenti.DimensionePanel());
    
    
    		panel1.setPreferredSize(d2);
    
    		this.setLayout(new BorderLayout());
    		this.add(panel1, BorderLayout.CENTER);
    		this.setBorder(BorderFactory.createTitledBorder("Registratore di Cassa"));
    		
    		MyTableModel tableModel = new MyTableModel();
    		ArrayList<Articoli> array = new ArrayList<Articoli>();
    		Articoli art = new Articoli();
    		art.setCodice(1);
    		art.setNome("Art 1");
    		art.setQuantita(100);
    		array.add(art);
    		art = new Articoli();
    		art.setCodice(2);
    		art.setNome("Art 2");
    		art.setQuantita(1020);
    		array.add(art);
    		
    		tableModel.setlLista(array);
    		
    		JTable table = new JTable(tableModel);
    		table.setAutoResizeMode (JTable.AUTO_RESIZE_ALL_COLUMNS);
    		
    		JScrollPane jScrollPane1 = new javax.swing.JScrollPane();
    		jScrollPane1.setName("jScrollPane1");
    		jScrollPane1.setViewportView(table);
    		jScrollPane1.setPreferredSize(d2);
    		jScrollPane1.getViewport().add(table);
    		jScrollPane1.setVisible(true);
    		
    		GridBagConstraints GBC = new GridBagConstraints();
    		Container CR = new Container();
    		GridBagLayout GBL = new GridBagLayout();
    		CR.setComponentOrientation(ComponentOrientation.UNKNOWN);
    		CR.setLayout(GBL);     
    		panel1.add(CR);
    
    		
    
    		GBC = new GridBagConstraints();
    		CR.add(jScrollPane1);
    		GBC.gridx=0;
    		GBC.gridy=1;
    		GBC.gridwidth=10;
    		GBC.gridheight=11;
    		GBC.insets.top=5;
    		GBC.insets.bottom=10;
    		GBC.insets.left=2;
    		GBC.insets.right=10;
    		GBC.fill=GridBagConstraints.HORIZONTAL;
    		GBL.setConstraints(jScrollPane1,GBC);
    	}
    		
    	static class MyTableModel extends DefaultTableModel {
    		private static final Object[] columnNames = {"Cod Prodotto", "Descrizione Prodotto", "Quantità"};
    		public ArrayList<Articoli> lista;
    		public MyTableModel() {
    			super(columnNames, 1);    // 10 righe iniziali (vuote)
    		}
    
    		public boolean isCellEditable(int rowIndex, int columnIndex) {
    			//	return columnIndex == 1;    // Solo la prima colonna è editabile
    			return (columnIndex != 0);
    
    		}
    
    		public Class getColumnClass(Float columnIndex) {
    			return Float.class;    // Le due colonne sono numeri interi
    		}
    		
    		public void setlLista(ArrayList<Articoli> lista){
    			this.lista=lista;
    			fireTableDataChanged();
    		}
    
    		
    	}//fine

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da bircastri
    codice:
    	static class MyTableModel extends DefaultTableModel {
    		private static final Object[] columnNames = {"Cod Prodotto", "Descrizione Prodotto", "Quantità"};
    		public ArrayList<Articoli> lista;
    		public MyTableModel() {
    			super(columnNames, 1);    // 10 righe iniziali (vuote)
    		}
    
    		public boolean isCellEditable(int rowIndex, int columnIndex) {
    			//	return columnIndex == 1;    // Solo la prima colonna è editabile
    			return (columnIndex != 0);
    
    		}
    
    		public Class getColumnClass(Float columnIndex) {
    			return Float.class;    // Le due colonne sono numeri interi
    		}
    		
    		public void setlLista(ArrayList<Articoli> lista){
    			this.lista=lista;
    			fireTableDataChanged();
    		}
    
    		
    	}//fine
    Perché estendi DefaultTableModel? Io avevo detto AbstractTableModel.

    DefaultTableModel ha già la "sua" struttura dati (un Vector di Vector di Object) ma se la usi (anche andando a riempire le sue celle) di fatto "perdi" la nozione e unità dei tuoi articoli.

    Quindi estendi AbstractTableModel e implementa in modo "sensato" tutti i metodi necessari il cui comportamento deve essere diverso dalla implementazione di default fornita in AbstractTableModel.


    P.S. Se la classe che tu chiami Articoli modella 1 articolo ... dovrebbe essere Articolo.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  9. #9
    Va bene ok, tralasciando stare i nomi di una classe

    ho modificato il table model da estendere defaulttablemodel a abstracttablemodel.

    Ho implementato i seguenti metodi

    getColumnCount
    getRowCount
    getColumnName

    ora quello che io dico che è da ritoccare è il metodo getValueAt();

    poichè io gli devo dire

    codice:
     public Object getValueAt(int row, int col) {
    			if(col==0)
                               return (Articoli)lista.get(row).getCodiceArticolo();
                           else
                              ..........
    
    	       
    	    }
    cioè io prendo l'articolo che nella mia lista si trova in posizione row e mi prendo tutti i campi in base alla colonne è corretto?

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Originariamente inviato da bircastri
    Va bene ok, tralasciando stare i nomi di una classe
    Era solo una nota/suggerimento!
    Io cerco in genere di prestare anche attenzione ai nomi.

    Originariamente inviato da bircastri
    ora quello che io dico che è da ritoccare è il metodo getValueAt();

    codice:
     public Object getValueAt(int row, int col) {
    			if(col==0)
                               return (Articoli)lista.get(row).getCodiceArticolo();
                           else
                              ..........
    
    	       
    	    }
    La struttura dati è una lista di articoli. Tramite il row (la riga) estrai un oggetto articolo (lo fai 1 volta sola in getValueAt). Poi con il col (la colonna) fai o una classica catena di if o uno switch per dire: se colonna 0 restituisci la proprietà X, se colonna 1 restituisci la proprietà Y, ecc.....
    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 © 2025 vBulletin Solutions, Inc. All rights reserved.