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

    ArrayList che si svuota

    Ciao a tutti, sto creando un programmino con interfaccia grafica per registrare cani (non chiedetemi a cosa serve )
    ho 7 classi le spiego brevemente:

    Main chiama la classe home.

    Home crea un frame con 2 tasti, inserisci e cerca (premendo i tasti chiama le rispettive funzioni).

    Inserisci crea una finestra dove è possibile registrare un cane e lo inserisce nell'arraylist situato nella classe "Lista".

    Visualizza crea una finestra dove viene chiesto il nome del cane da visualizzare, chiama la cerca (situata nella classe lista) che ritorna la posizione dopo di che si apre la finestra che visualizza i dati del cane.

    Lista contiene l'arraylist, la funzione cerca e 2 funzioni che richiamo la salva e la carica su file.

    DatFile classe per il salvataggio e il caricamento su file.

    Cane contiene i dati del cane (la struct del C).

    Il problema è che dopo l'inserimento, quando si chiama la cerca l'arraylist si svuota ... (ho verificato con il debug che l'inserimento funziona, il cane c'è nell'arreylist). Spero di essere stato abbastanza chiaro

    codice:
    public class Main {
    
        public static void main(String[] args) {
            Home h=new Home();
        }
    }
    codice:
    public class Visualizza extends JFrame implements ActionListener, Serializable {
        private JTextField textnome;
        private JButton cerca;
        private JFrame f;
        private JFrame f2;
        private Lista l=new Lista();
        private ArrayList temp=new ArrayList();
    
        Visualizza(){
            elementi();
        }
    
        public void elementi(){
            //Frame
            f=new JFrame();
            f.setVisible(true);
            f.setTitle("Cerca un Cane");
            f.setSize(500, 100);
            f.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f.setLayout(null);
            //Nome da cercare
            JLabel nome=new JLabel("Nome del cane da cercare:");
            nome.setBounds(10, 10, 160, 20);
            textnome=new JTextField();
            textnome.setBounds(170, 10, 110, 20);
            //Pulsante
            cerca=new JButton("Cerca");
            cerca.setBounds(290, 10, 110, 20);
            cerca.addActionListener(this);
    
            //Add
            f.add(nome);
            f.add(textnome);
            f.add(cerca);
        }
    
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(cerca)){
                String x=textnome.getText();
                int pos=l.cerca(x);
                if(pos!=-1){
                    f.dispose();//chiude la finestra
                    visualizzatore(pos);
                }
            }
        }
    
        private void visualizzatore(int pos){
            //Frame
            f2=new JFrame();
            f2.setVisible(true);
            f2.setTitle("Visualizza un cane");
            f2.setSize(500, 300);
            f2.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f2.setLayout(null);
            //Get
            Cane c=new Cane();
            temp=l.GetArray();
            temp.get(pos);
            //Lista.array.get(pos);
            String n=c.getNome();
            //Stampa
            JTextField textnomee=new JTextField(n);
            textnomee.setBounds(10, 10, 120, 20);
            //Add
            f2.add(textnomee);
        }
    
    
    }
    codice:
    public class Lista extends JFrame implements Serializable {
        public ArrayList<Cane> array=new ArrayList();
        public int asd=5;
    
        Lista(){
    
        }
        public void aggiungi(Cane c){
            array.add(c);
            salva();
        }
    
        public void salva(){
            DatFile f=new DatFile("archivio");
            f.write(array);
        }
        
        public void carica(){
            DatFile f=new DatFile("archivio");
            f.read();
        }
    
        public int cerca(String cod){
            if(array.size()==0){
                JOptionPane.showMessageDialog(this, "Lista dei Cani vuota");
            }
             for(int i=0;i<array.size();i++){
                 if((array.get(i).getNome()).equals(cod)){
                    JOptionPane.showMessageDialog(this, "TROVATO! "+i);
                    return (i);
                 }
            }
            JOptionPane.showMessageDialog(this, "Impossibile trovare "+cod);
            return -1;
        }
    
        public ArrayList GetArray(){
            return array;
        }
    }
    codice:
    public class Inserisci extends JFrame implements ActionListener, Serializable {
        private Lista l=new Lista();
        private JButton salva;
        private JTextField textnome,textmadre,textanno,textgiorno,textmese;
        private JFrame f;
    
        Inserisci(){
            elementi();
        }
    
        public void elementi(){
            //Frame
            f=new JFrame();
            f.setVisible(true);
            f.setTitle("Nuovo cane");
            f.setSize(500, 300);
            f.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f.setLayout(null);
            //Inserimento del nome
            JLabel nome=new JLabel("Nome:");
            nome.setBounds(10, 10, 120, 20);
            textnome=new JTextField();
            textnome.setBounds(60, 10, 110, 20);
            //Inserimento Madre
            JLabel madre=new JLabel("Figlio di:");
            madre.setBounds(10, 40, 120, 20);
            textmadre =new JTextField();
            textmadre.setBounds(60, 40, 110, 20);
            //Data di Nascita
            JLabel nascita=new JLabel("Data Nascita:");
            nascita.setBounds(10, 70, 120, 20);
            textanno=new JTextField("aaaa");
            textanno.setBounds(70, 90, 40, 20);
            textmese=new JTextField("mm");
            textmese.setBounds(35, 90, 27, 20);
            textgiorno=new JTextField("gg");
            textgiorno.setBounds(10, 90, 20, 20);
            //pulsante salva
            salva =new JButton("Salva");
            salva.setBounds(200, 150, 80, 40);
            salva.addActionListener(this);
    
            //aggiunta elementi al frame
            f.add(nome);
            f.add(textnome);
            f.add(nascita);
            f.add(textanno);
            f.add(textmese);
            f.add(textgiorno);
            f.add(madre);
            f.add(textmadre);
            f.add(salva);
        }
    
        public void actionPerformed(ActionEvent e) {
            if (e.getSource().equals(salva)){
                String nome=textnome.getText();
                String madre=textmadre.getText();
                String ann=textanno.getText();
                String mes=textmese.getText();
                String giorn=textgiorno.getText();
                try{
                    int anno = Integer.parseInt(ann);
                    int mese = Integer.parseInt(mes);
                    int giorno = Integer.parseInt(giorn);
                }
                catch(Exception q){
                        JOptionPane.showMessageDialog(this, "Anno, Mese e giorno devono essere numeri.");
                }
                int anno = Integer.parseInt(ann);
                int mese = Integer.parseInt(mes);
                int giorno = Integer.parseInt(giorn);
                Cane c=new Cane(nome,madre,anno,mese,giorno);
                //f.dispose();//chiede la finestra
                f.setVisible(false);
                l.aggiungi(c);
            }
        }
    
    }
    codice:
    public class Home extends JFrame implements Serializable,ActionListener {
        private JFrame f;
        private JButton inserisci,cerca;
    
        Home(){
            index();
        }
    
        public void index(){
            //Frame
            f=new JFrame();
            f.setVisible(true);
            f.setTitle("<<Dog>>");
            f.setSize(500, 300);
            f.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f.setLayout(null);
            //Pulsante inserisci
            inserisci =new JButton("Inserisci");
            inserisci.setBounds(10, 20, 100, 30);
            inserisci.addActionListener(this);
            //Pulsante Cerca
            cerca =new JButton("Cerca");
            cerca.setBounds(150, 20, 100, 30);
            cerca.addActionListener(this);
            //Add
            f.add(inserisci);
            f.add(cerca);
        }
    
        public void actionPerformed(ActionEvent e) {
            if(e.getSource().equals(inserisci)){
                Inserisci i=new Inserisci();
            }
            if(e.getSource().equals(cerca)){
                Visualizza v=new Visualizza();
            }
        }
    
    }
    codice:
    public class Cane implements Serializable {
        private String nome,madre;
        private int anno,mese,giorno;
    
        Cane(String nom,String madr,int ann,int mes,int giorn) {
            nome=nom;
            madre=madr;
            anno=ann;
            giorno=giorn;
            mese=mes;
        }
        Cane(){
        }
    
        public String getNome(){
            return nome;
        }
    
        public String getMadre(){
            return madre;
        }
    
        public int getAnno(){
            return anno;
        }
    
        public int getMese(){
            return mese;
        }
    
        public int getGiorno(){
            return giorno;
        }
    
    }
    codice:
    public class DatFile  implements Serializable {
    
        String nf;
    
        DatFile(String s){
    
            nf=s.concat(".dat");
        }
            public void write(ArrayList A){
        
                    try {
    
                        FileOutputStream f = new FileOutputStream(nf);
                        ObjectOutputStream fOUT = new ObjectOutputStream(f);
    
                        fOUT.writeObject(A);
                        fOUT.flush();
    
                        f.close();
                    }
                    catch (Exception e) {
                        System.out.println("Eccezione : "+e.getMessage());
                    }
    
    
            }
            public ArrayList read(){
            
                 ArrayList A = new ArrayList();
    
                 try {
    
                    FileInputStream f = new FileInputStream(nf);
                    ObjectInputStream fIN = new ObjectInputStream(f);
    
                    try {
    
                        A = (ArrayList) fIN.readObject();
                     }
                    catch (Exception e) {
    
                        System.out.println("Eccezione : "+e.getMessage());
                    }
                       
                    f.close();
                }
                catch (Exception e) {
    
                    System.out.println("Eccezione : "+e.getMessage());
                }
                return A;
            }
    
    }

  2. #2
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    ma sei sicuro che l'array si svuoti? o è solo che non ti visualizza i dati?
    perchè nella funzione visualizzatore, quando fai

    codice:
    private void visualizzatore(int pos){
            //Frame
            f2=new JFrame();
            f2.setVisible(true);
            f2.setTitle("Visualizza un cane");
            f2.setSize(500, 300);
            f2.setDefaultCloseOperation(EXIT_ON_CLOSE);
            f2.setLayout(null);
            //Get
            Cane c=new Cane();
            temp=l.GetArray();
            temp.get(pos);
            //Lista.array.get(pos);
            String n=c.getNome();
            //Stampa
            JTextField textnomee=new JTextField(n);
            textnomee.setBounds(10, 10, 120, 20);
            //Add
            f2.add(textnomee);
        }
    quello che fai è:
    1) crei la variabile c di tipo Cane
    2) recuperi l'array
    3) cerchi il cane nella posizione "pos"
    4) assegni alla stringa n il nome della variabile c

    Ma la variabile c non è mai stata inizializzata (il costruttore non fa nulla),

    dovresti fare qualcosa tipo

    codice:
    c = temp.get(pos);
    questo ad una prima occhiata veloce del codice...se l'errore non è questo fammi sapere che vediamo meglio.

    Ah, un'altra cosa...negli attributi di Lista, meglio che l'array lo inizializzi così:
    codice:
    public ArrayList<Cane> array=new ArrayList<Cane>();
    Jekkil

  3. #3
    no l'errore era che da ogni classe inizializzavo una cariabile lista quindi veniva ricreato l'array ogni volta... ho sistemato mettendo "public static Lista l=new Lista();" e così ogni volta che mi serve un metodo nella classe lista la chiamo su questa variabile l (che è creata solo una volta nel main
    adesso sono alle prese con gli inserimenti di un immagine per ogni cane... ma poi visualizarla missà che è troppo difficile lo farò tra un pò, prima o poi a scuola ce lo insegneranno

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    ah allora se l'errore era quello...piccolo suggerimento...hai mai sentito parlare di pattern Singleton?
    Jekkil

  5. #5
    Originariamente inviato da Jekkil
    ah allora se l'errore era quello...piccolo suggerimento...hai mai sentito parlare di pattern Singleton?
    no, cosa sono?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2005
    Messaggi
    356
    cerco di spiegartelo in parole semplici

    il singleton è un modo di progettare una classe in modo tale che all'interno di un'applicazione tale classe venga creata una sola volta. In questo modo se la si usa più volte all'interno dell'applicazione e in punti diversi si è sicuri che sia sempre quella.

    Quindi proprio quello che fa al caso tuo.

    Come implementarla:

    il modo più semplice è quello che prevede che una classe di tipo Singleton abbia tra gli attributi un attributo "istanza" di tipo della classe stessa.
    Il costruttore poi sarà privato, in modo tale che la classe non venga mai direttamente creata.
    Infine ci sarà un metodo getter static utilizzato per ottenere l'istanza della classe.

    Esempio:
    codice:
    public class mioSingleton{
         // attributo statico di tipo mioSingleton
         private static mioSingleton istanza;
    
        private mioSingleton(){ 
            //codice del costruttore
        }
    
        //metodo getter statico
        public static mioSingleton getUniqueInstance()
        {
            if (istanza==null)
            {
                  istanza = new mioSingleton();
            }
            return istanza;
    }
    in questo modo, ogni volta che nella tua applicazione vorrai usare la classe mioSingleton dovrai fare così:
    codice:
    mioSingleton s = mioSingleton.getUniqueInstance();
    N.B. è importante che sia l'attributo istanza che il metodo getUniqueInstace() siano statici. Se il motivo non ti è chiaro dimmi pure che te lo spiego

    Spero di averti illuminato almeno un po...se no chiedi pure...
    Jekkil

  7. #7
    credo di averlo capito, domani lo guardo meglio e provo a metterlo in pratica

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.