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

    [Java] riempimento jtable da file

    Salve ragazzi, non ho una grossa esperienza in java. Quello che vi chiedo oggi è come riuscire a creare una jtable e riempirla leggendo i dati che ho memorizzato in un file. Inoltre come inserire una scroll bar solamente per la jtable nel caso in cui i dati da visualizzare siano molti. Grazie mille ragazzi

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Java ha una sezione dedicata.

    Sposto.

    La richiesta è decisamente vaga ed ampia. Cosa non sei riuscito a fare? La lettura del file? La creazione della JTable? Il popolamento del TableModel con i dati letti dal file? La visualizzazione della JTable? Tutti aspetti diversi della stessa questione.

    Hai ottenuto degli errori durante lo sviluppo o ti sei fermato ad un certo punto? Dove?
    Non hai postato del codice, quindi non possiamo sapere cosa hai in mano, come hai strutturato la cosa ed eventualmente cosa ci sia di sbagliato in quello che hai fatto.

    Ti consiglio, innanzitutto, di prendere visione del tutorial ufficiale Oracle sull'utilizzo delle JTable (che è un componente "complesso", in quanto richiede diversi altri componenti).

    Per la parte della scrollbar si tratta semplicemente di inserire la JTabel in uno JScrollPane. Fine... fa tutto lui.

    Ovviamente il discorso è ampio e trattarlo interamente in una discussione del forum è impossibile, quindi cerca di spiegare più in dettaglio il tuo problema.

    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
    Ciao LeleFT,
    io credo di avere lo stesso problema. Ho creato un gestionale con java su eclipse, sono arrivata ad un punto: cerco di caricare dei dati salvati su un file .txt, sulla tabella creata e non riesco. Cosa posso fare? Se puoi, aiutami per favore.
    Grazie in anticipo

  4. #4
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Anche nel tuo caso, posta il codice che hai scritto... come possiamo aiutarti se non sappiamo nulla?


    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
    Ecco il codice che ho scritto per quella funzione:

    codice:
    import java.awt.Point;
    import java.awt.event.MouseAdapter;
    import java.awt.event.MouseEvent;
    import java.io.BufferedReader;
    import java.io.FileReader;
    import java.io.IOException;
    import java.util.ArrayList;
    
    import javax.swing.JTable;
    
    public class DoubleClickListener extends MouseAdapter{
        private JTable t;
        private PanelAppFiltro paf;
        private MyMenuFrame padre;
        private Archivio arc;
        int idcliente;
        private int clickRow = 1 ;   //Questo campo contiene l'indice della riga su cui si
                                    //deve fare doppio click per aprire la finestra;
                                    //puoi anche passarlo nel costruttore o gestirlo in altro modo
        private ClienteAcquirente cliente;
        
        public DoubleClickListener(MyMenuFrame mf, Archivio arc, JTable t){
            this.arc = arc;
            this.padre = mf;
            this.t = t;
            
            //int idcliente;
            
        }
            
        public void mouseClicked(MouseEvent e){  //A noi interessa solo l'evento di click
            
              //arc.getNumContact();
              
               if(e.getClickCount() < 2) //se non è doppio click ritorno
                       return;
                   
               if(e.getButton() != MouseEvent.BUTTON1)//Considero solo i click del pulsante sinistro;
                       return;                              //se vuoi gestire l'evento anche se si fa dopppio
                                                          //click col tasto destro commenta questo if
                   
               int x = Integer.parseInt ((String)t.getValueAt(t.getSelectedRow(), 2));
                         
               System.out.println(x);
               
               try {
                    String str; // array che mi da il nome(prima stringa),
                                // cognome(seconda stringa) ecc..
    
    
                    BufferedReader in = new BufferedReader(new FileReader(
                        "ARCHIVIO.txt"));
                    // "ARCHIVIO.txt"));
                    int idcliente=1;
                    int cicliWhile = 0;
                    while ((str = in.readLine()) != null) {
                        cicliWhile++;
                        
                        if(cicliWhile == x){
                            String[] strcliente;
                            strcliente = str.split("#");
    
    
                            ClienteAcquirente cliente = new ClienteAcquirente(
                                    strcliente[0], strcliente[1], idcliente,
                                    strcliente[3], strcliente[4], 
                                    strcliente[5],strcliente[6], strcliente[7],Double.parseDouble(strcliente[8]), 
                                    strcliente[9], strcliente[10], strcliente[11]);
                            
                            arc.add(cliente);
                            System.out.print(str);
                            break;
                            
                        }
    
    
                    }
                    
                    in.close();
                
                }
                catch (IOException ev) {
    
    
                }
               
                this.padre.pannelloVisibile.setVisible(false);
                this.padre.pannelloVisibile = new PanelAppFiltro(arc, this.padre/*clickedRow+1*/);
                
                //System.out.println("asd "+this.padre.getNumContact(idcliente));
                this.padre.getContentPane().add(this.padre.pannelloVisibile);
                this.padre.pannelloVisibile.setVisible(true);
             
                  System.out.println("buonasera");  
                
               JTable t = (JTable)e.getSource();   //Ricavo la tabella che ha prodotto l'evento
        
               int clickedRow = t.rowAtPoint(e.getPoint()); //Calcolo la riga su cui si è fatto click
                   
                if(clickedRow != clickRow)   //Se non è la riga che mi interessa ritorno
                        return;               
               
                     
              //Potrei costruire la nuova finestra tipo popup???
                  
        }
    
    
        private int rowAtPoint(Point point) {
                return idcliente;
        }
        
        }
    Ultima modifica di LeleFT; 16-06-2015 a 14:08 Motivo: Aggiunti i tag CODE

  6. #6
    Praticamente, quando faccio il doppio click, non mi si apre la riga del file sulla tabella, ma sulla console.
    Non riesco a capire dove sbaglio..
    Grazie intanto per la pazienza

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Quel che stai facendo è sbagliato fin dalle basi... come dicevo anche all'autore di questo post, le JTable sono componenti complessi e vanno gestite in modo corretto: ciascuna riga della tabella dovrebbe essere rappresentata da una classe (credo che tu ce l'abbia e si chiami ClienteAcquirente, ma non ne posso essere sicuro), si dovrebbe costruire un TableModel in cui inserire tutte le righe da far visualizzare alla JTable e poi passare questo TableModel alla JTable perchè si occupi di visualizzarli.

    Le operazioni di I/O (lettura da file, nel tuo caso) non andrebbero MAI fatte nel contesto dell'EDT (e tu lo stai facendo all'interno di un metodo richiamato dal EDT al clic del mouse: no, vanno fatte in un thread a parte).

    Se ho capito bene, i dati che visualizzi nella JTable li prelevi da un file "ARCHIVIO.txt"... se è corretto non vedo che senso abbia andarli a rileggere dal file in seguito al clic... li hai già letti per mostrarli, tutto quel che accade dopo non dovrebbe comportare una ri-lettura da file degli stessi dati. E' per questo che si usa un TableModel: leggo i dati dal file, leggendo i dati creo tante istanze di una mia classe che rappresenta la riga della tabella, butto queste istanze nel TableModel... se voglio "recuperare" i dati di una determinata riga, li prendo dal TableModel, non dal file.

    A parte tutto questo, ti chiedi come mai i dati le visualizzi nella console e non sulla tabella (ma la tabella è inizialmente vuota? Boh...): il motivo è sempilce... li stai stampando in output sulla console:

    codice:
    while ((str = in.readLine()) != null) {
       cicliWhile++;
    
       if(cicliWhile == x){
          String[] strcliente;
          strcliente = str.split("#");
    
    
          ClienteAcquirente cliente = new ClienteAcquirente(
                            strcliente[0], strcliente[1], idcliente,
                            strcliente[3], strcliente[4], 
                            strcliente[5],strcliente[6], strcliente[7],Double.parseDouble(strcliente[8]), 
                            strcliente[9], strcliente[10], strcliente[11]);
                            
          arc.add(cliente);
          System.out.print(str);
          break;
    
       }
    
    }

    Tu stai leggendo il file, costruendo un bean (ClienteAcquirente) per ogni riga letta, aggiungi questo bean ad un "Archivio" (cos'è?) e stampi la riga in output... da nessuna parte stai riempiendo la tabella (ripeto: ciò che va riempito è il TabelModel associato alla JTable).

    Poi si potrebbe disquisire anche della gestione delle eccezioni che andrebbe rifatta, ma esula al momento.


    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

  8. #8
    Grazie infinite, seguirò i tuoi consigli per cercare di migliorare il tutto.
    Davvero molto gentile.
    Ciao ciao

Tag per questa discussione

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 © 2024 vBulletin Solutions, Inc. All rights reserved.