Visualizzazione dei risultati da 1 a 7 su 7
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99

    Refresh JTable

    Ciao,


    durante un ciclo d'aggiornamento JTable, dove aggiorno riga per riga , il risultato mi viene mostrato unicamente al termine dell'esecuzione di detto ciclo.


    Ho provato diversi metodi come

    codice:
     
     SwingUtilities.invokeLater(new Runnable() {
    
       public void run() {
       DefaultTableModel model = (DefaultTableModel)MyTable.getModel();
       MyTable.setModel(model);
       model.fireTableDataChanged(); 
          }
    	 });

    oppure:
    codice:
     
      DefaultTableModel model = (DefaultTableModel)MyTable.getModel();
    	 							                     model.fireTableDataChanged();
    senza successo.

    Si aggiorna unicamente in due casi (tentativi per vani ed inutili):

    1) caso io metta un JOptionPane.showMessageDialog che spunta fuori ad ogni ciclo...ma è assolutamente improponibile.

    2) MyTable.update(getGraphics()); Però purtroppo mi "sposta" la jtable...e fa casino...


    repaint e validate non hanno sortito effetto, potete aiutarmi?






    grazie anticipatamente!
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  2. #2
    Sicuramente la via giusta è quella di utilizzare un nuovo thread per modificare la tabella, tentativo che + o - avevi fatto utilizzando SwingUtilities; sarebbe meglio utilizzare SwingWorker...
    Il problema sta nel fatto su come effettui il cambiamento delle righe della tabella.
    Dal codice incollato nn si vede nulla di dove la aggiorni, ma avendo ormai il "master in decoding users problems", vedendo questa riga di codice
    codice:
    MyTable.setModel(model);
    Suppongo che creii un nuovo model, con i dati aggiornati e poi lo assegni alla tabella.
    Cosi facedo però l'interfaccia si aggiornerà solamente dopo che effettuerai tale assegnazione...


  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    ehehe...no dai cercherò d'essere più preciso.

    codice:
    DefaultTableModel model = (DefaultTableModel)mytable.getModel();
    model.setRowCount(0);
    int conta = 0;
    try{ 
    
    	
    	while(i.hasNext())
    		
    	{ 
    		model.insertRow(conta,new Object[]  {"","","","",""});
    	 
    		rs = null; 
    	 
    		rs = stmt.executeQuery(query); 
    		 
    		while(rs.next()){ 
    			
    			mytable.setValueAt(rs.getString(1), conta, 1);
    			
    			} 
    		 
    		 conta++;
    	}

    Ad essere sincero il model l'ho aggiunto...prima il metodo setValueAt era diretto e agiva senza addrow attraverso model...

    Pensavo fosse sufficiente...invece no...


    grazie...spero di trovare una soluzione...sembra una cosa semplicissima invece ci sto impazzendo....
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  4. #4
    Allora come ti dicevo il problema sta nel far si che l'aggiornamento della tabella avvenga fuori dal EDT e quindi in un'altro Thread.
    Ti posto un esempio banale di come fare.
    codice:
    package it.muia.testricchefacce;
    
    import java.awt.BorderLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.util.List;
    import java.util.concurrent.TimeUnit;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
    import javax.swing.SwingUtilities;
    import javax.swing.SwingWorker;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.TableModel;
    
    public class TestJTable extends JFrame {
    
        public TestJTable() {
            this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            this.setLayout(new BorderLayout());
            final DefaultTableModel model = new DefaultTableModel(new Object[][] { { 1, 1 }, { 2, 2 }, { 3, 3 } }, new Object[] {
                    "ID", "VALUE" });
            final JTable jTable = new JTable(model);
            JScrollPane pane = new JScrollPane(jTable);
            this.add(pane, BorderLayout.CENTER);
            JButton updateButton = new JButton("UPDATE");
            updateButton.addActionListener(new ActionListener() {
    
                @Override
                public void actionPerformed(ActionEvent e) {
                    UpdateWork updateWork = new UpdateWork(model);
                    updateWork.execute();
                }
            });
            this.add(updateButton, BorderLayout.SOUTH);
            this.pack();
            this.setVisible(true);
        }
    
        class UpdateWork extends SwingWorker<TableModel, Object[]> {
            private DefaultTableModel model;
    
            public UpdateWork(DefaultTableModel model) {
                this.model = model;
            }
    
            @Override
            protected TableModel doInBackground() throws Exception {
                for (int i = 0, value = 4; i < 10; i++, value++) {
                    publish(new Object[] { value, value });// produco la nuova riga da aggiungere
                    TimeUnit.SECONDS.sleep(2);// simulo un operazione pesante
                }
                return model;
            }
    
            @Override
            protected void process(List<Object[]> chunks) {
                for (Object[] row : chunks) {
                    model.addRow(row);
                }
            }
    
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
    
                @Override
                public void run() {
                    TestJTable testJTable = new TestJTable();
                }
            });
        }
    }

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    ho visto, diciamo che ho provato ad "adattare" il mio codice ed è uscito un pastrugno...


    mi sa che devo riscrivere daccapo...
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

  6. #6
    In questa discussione avevo affrontato un problema simile,
    vedi se può servirti.... ciao

    http://forum.html.it/forum/showthrea...6#post13636156

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2004
    Messaggi
    99
    grazie ho sistemato!!
    se mi chiedeste chi è per me un vero amico vi risponderei che è una persona che io considero alla pari di me.

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.