Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568

    Problemi aggiornamento JScrollPane

    Ciao a tutti ho un problema con un JScrollPane. Viene creato tramite una JTable ottenuta dai valori di un DB MySql. Attraverso una serie di TextField e di un bottone inserisco i valori nel db e richiamo il metodo che mi crea la tabella (restituisciTabella()) che in teoria dovrebbe ridisegnarmela. Il tutto non avviene. La tabella rimane tale e quale a com'è e non vedo il nuovo valore inserito. Qualcuno mi sa aiutare? Questo è il codice del metodo e la porzione di codice che lo richiama una volta inserito il nuovo valore

    codice:
    private JScrollPane restituisciTabella() throws ClassNotFoundException, SQLException, MalformedURLException {
    
    		connetti();
    
    		ResultSet resultSet=statement.executeQuery("SELECT * FROM ricercatore");
    		ResultSetMetaData metaData=resultSet.getMetaData();
    		int numberOfColumn=metaData.getColumnCount();
    
    		String[] labels = {"Identificativo", "Nome prodotto", "Prezzo", "Sito per l'ordine"};
    
    		int[] widths = {50, 70, 220, 200};
    
    		int a=statement.getFetchSize();
    
    		Object q=null;
    		Vector<Object> nomi=new Vector<Object>(1,0);
    		Object k=null;
    		Object pre=null;
    		Object dispon=null;
    
    		Vector columnNames = new Vector(0, 4);
    
    		for(int i = 0; i < numberOfColumn; i++) {
    			columnNames.addElement(labels[i]);
    		}
    		DefaultTableModel tableModel = new DefaultTableModel(null, columnNames);
    		
    		JTable table = new JTable();
    		table.setModel(tableModel);
    
    		while(resultSet.next()){
    			Vector<Object> identifi = new Vector<Object>();
    			q=resultSet.getString("idRicercatore");
    			k=resultSet.getString("nomeProdotto");
    			pre=resultSet.getString("prezzo");
    			dispon=resultSet.getString("siti");
    
    			identifi.addElement(q);
    			identifi.addElement(k);
    			identifi.addElement(pre);
    			identifi.addElement(dispon);
    			
    			System.out.println(q);
    
    			tableModel.addRow(identifi);
    		}
    		
    		table.setPreferredScrollableViewportSize(new Dimension(350, 100));
    		JScrollPane scroll = new JScrollPane(table);
    		table.scrollRectToVisible(table.getCellRect(table.getRowCount()-1, 0, true));
    		return scroll;
    	}
    codice:
    .....  
    insertProductButton.addActionListener(new ActionListener(){
    			public void actionPerformed(ActionEvent event) {
    				/********* DEVO SCRIVERE IL CODICE PER PRELEVARE L'ID DIRETTAMENTE DA DB*/
    				
    				int idRicercatore = 2;
    				double prezzo;
    				try {
    					String nomeProdotto=new String(nameProdTextField.getText());
    					String site=new String("www.keyaku.it");
    					
    					
    					if (prezzoField.getText().equals(""))
    						prezzo=0;
    					else
    						prezzo=Double.parseDouble(prezzoField.getText());
    					
    					if((!(idTextField.getText().isEmpty()) && !(nomeProdotto.isEmpty()) && !(site.isEmpty()))){
    						
    						aggiungiValore(idRicercatore,nomeProdotto,prezzo,site);
    						viewTableRicercatore=null;
    						viewTableRicercatore=restituisciTabella();
    						viewTableRicercatore.invalidate();
    						viewTableRicercatore.repaint();
    					}else{
    						JOptionPane.showMessageDialog(null, "Errore! Inserire valori validi in tutti i campi (numeri per il prezzo e testo per il nome prodotto e il sito");
    					}						
    				} catch (ClassNotFoundException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();
    				} catch (SQLException e1) {
    					// TODO Auto-generated catch block
    					e1.printStackTrace();	
    				} catch (NumberFormatException nFE) { 
    					nFE.printStackTrace(); 
    				} catch (MalformedURLException e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    ........
    Grazie in anticipo a chi mi aiuterà... ;-)

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Non è così che si lavora con le tabelle (JTable).
    JTable è un componente "complesso" che va usato secondo i paradigmi del modello MVC.

    C'è un Model che contiene i dati da visualizzare, ci deve essere un Controller che popola/modifica il model. JTable è solo la View, che si occupa di visualizzare il contenuto.

    Quando devi cambiare il contenuto di una JTable, non devi toccare la JTable ma il suo model, il quale dovrà essere correttamente costruito in modo da notificare la JTable dei cambiamenti (record aggiunti, tolti, modificati).

    Quello che fai tu è di costruire ogni volta una nuova tabella, un nuovo JScrollPane e poi rendere nulli i reference. Solo che se non dici al contenitore che il reference è cambiato, non potrà mai ridisegnare la nuova tabella. Uno spreco enorme di risorse e memoria.

    Ti consiglio di visionare il Tutorial sull'uso di JTable.


    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

  3. #3
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    Supponevo il problema fosse il TableModel.
    Effettivamente sto riusando il codice di un progetto di un amico per la stesura di un progetto d'esame universitario e quindi lavorando molto velocemente cerco di trovare possibili errori o cose da correggere. Purtroppo si sono generate quando lui ha stesso il codice velocemente per fare l'esame ... ad avere più tempo.....

    Se non ho capito male quello che devo fare è creare un Model che prelevi i dati e notifichi alla table il cambiamento dei dati. Quindi il repaint avverrà in automatico. Dunque il model preleverà i dati e si occuperà dei cambiamenti. Ora leggo attentamente, grazie ancora. Eventualmente se ho problemi chiedo sempre qui

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,328
    Originariamente inviato da AR64S-H
    Se non ho capito male quello che devo fare è creare un Model
    Sì.

    che prelevi i dati
    No, il model non dovrebbe occuparsi di prelevare i dati. Il model non dovrebbe conoscere affatto la provenienza dei dati. Lui deve solo "mantenere" i dati per la JTable e notificarla in caso di cambiamenti su di lui. Deve essere un altro componente (il controller) a prelevare i dati e popolare il model, il quale, venuto a conoscenza della modifica (quando il controller popola il model, per il model c'è una "aggiunta" di nuovi dati) deve notificare la JTable (attraverso uno dei metodi fireTableRowsXXX() ).

    e notifichi alla table il cambiamento dei dati. Quindi il repaint avverrà in automatico.
    Sì.

    Dunque il model preleverà i dati e si occuperà dei cambiamenti.
    Come sopra: no. Il model non si occuperà di prelevare i dati. Dovrebbe essere compito del "Controller", un componente separato che dialoga col DB e col Model.

    Ora leggo attentamente, grazie ancora. Eventualmente se ho problemi chiedo sempre qui
    Sì.

    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 AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    Stavo pensando se spostassi le dichiarazioni e le inizializzazioni nel costruttore della classe e usassi lo stesso metodo restituisciTabella() come controller, potrei usare questa riga
    tableModel.fireTableRowsInserted(0,tableModel.getR owCount());
    per aggiornare la tabella a ogni richiamo?
    Certo sprecherei memoria per lo scrollPane credo :\

  6. #6
    Utente di HTML.it L'avatar di AR64S-H
    Registrato dal
    Jun 2002
    Messaggi
    568
    Scrivo la soluzione qualora servisse a qualcuno:

    Ho creato una classe DBConnector che consente la gestione del DB. Esistono due comandi uno submitQuery e uno submitUpdate che effettuano le varie operazioni possibili sul db, come select, insert, update ecc ecc. Questi metodi prendono le stringhe query. In qualsiasi momento possiamo ottenere il resultset da db.submitQuery(query);

    La JTable e lo ScrollPane sono creati fuori dal metodo restituisciTabella() così da evitare spreco di risorse. Vengono inizializzati nel metodo inizializzaGUI chiamato dal costruttore. RestituisciTabella ora non restituisce nulla perchè dichiarata come void e opera solamente sul tablemodel. Praticamente eseque l'operazione db.submitQuery(stringa) e ne preleva un ResultSet da questo ricostruisce la struttura del tableModel prelevando le stringhe dal vector e aggiungendo ogni vector come riga sul tablemodel. Quest'operazione da sola effettua il repaint della tabella.

    Grazie dell'aiuto
    Ciao

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.