Errore Aggiungi

di il
4 risposte

Errore Aggiungi

Sto sviluppando, sempre a scopo didattico e con l'intendo di diventare sempre più pratico di java, un'applicazione che simula il sistema informativo per la gestioni di film e relativi attori con il ruolo che interpretano. Quello che vorrei fare e selezionando un film tra quelli presenti in una JTable cliccando sul JButton visualizzo una JDIalog con tutti gli attori che hanno partecipato e i rispettivi ruoli. Nella stessa JDialog è anche presente una ComboBox dove ci sono tutti gli attori presenti nel mio archivio. Quello che voglio fare è selezionare un'attore dalla comboBox e aggiungere il Ruolo che ha avuto interpretato nel film.

Ho scitto queste classi:

// Classe Film

public class Film implements Comparable<Film> {
    
    private List<AttoreRuolo> listaAttoreRuolo = new ArrayList<AttoreRuolo>();
    
    private String titolo;
    private String genere;
    private int durata;
    
    public Film() {}
    
    public Film(String titolo, String genere, int durata) {
        this.titolo = titolo;
        this.genere = genere;
        this.durata = durata;
    }
    
    public List<AttoreRuolo> getListaAttoreRuolo() {
        return listaAttoreRuolo;
    }

    public void setListaAttoreRuolo(List<AttoreRuolo> listaAttoreRuolo) {
        this.listaAttoreRuolo = listaAttoreRuolo;
    }

    public String getTitolo() {
        return titolo;
    }

    public void setTitolo(String titolo) {
        this.titolo = titolo;
    }

    public String getGenere() {
        return genere;
    }

    public void setGenere(String genere) {
        this.genere = genere;
    }

    public int getDurata() {
        return durata;
    }

    public void setDurata(int durata) {
        this.durata = durata;
    }
    
    public void aggiungiRuolo(AttoreRuolo ruolo) {
        this.listaAttoreRuolo.add(ruolo);
    }
    
    @Override
    public String toString() {
        String stringa = "";
        stringa += "Titolo" + titolo +"\n";
        stringa += "Genere" + genere +"\n";
        stringa += "Durata" + durata +"\n";
        return stringa;
    }

    public int compareTo(Film o) {
         if (this.getDurata()> o.getDurata()) {
            return -1;
        } else if (this.getDurata()< o.getDurata()) {
            return 1;
        }
        return 0;
    }
 
}
// Classe Attore

public class Attore {

    private String nome;
    private String cognome;
    private String nazionalita;
    
    public Attore() {}
    
    public Attore(String nome, String cognome, String nazionalita) {
        this.nome = nome;
        this.cognome = cognome;
        this.nazionalita = nazionalita;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCognome() {
        return cognome;
    }

    public void setCognome(String cognome) {
        this.cognome = cognome;
    }

    public String getNazionalita() {
        return nazionalita;
    }

    public void setNazionalita(String nazionalita) {
        this.nazionalita = nazionalita;
    }
    
    public String toStringAttore() {
      String stringa = "";
      stringa += "Nome" + nome +"\n";
      stringa += "Cognome" + cognome +"\n";
      stringa += "Nazionalità" + nazionalita +"\n";
      return stringa;
    }
    
}

// Classe AttoreRuolo

ublic class AttoreRuolo {
    
    public AttoreRuolo() {}
    
    private Attore attore;
    private String ruolo;
    
    public AttoreRuolo(Attore attore, String ruolo) {
        this.attore = attore;
        this.ruolo  = ruolo;
    }

    public Attore getAttore() {
        return attore;
    }

    public void setAttore(Attore attore) {
        this.attore = attore;
    }

    public String getRuolo() {
        return ruolo;
    }

    public void setRuolo(String ruolo) {
        this.ruolo = ruolo;
    }
    
     public String toString() {
        String stringa = "";
        stringa += "Nome Attore" + attore.getNome() +"\n";
        stringa += "Cognome Attore" + attore.getCognome() +"\n";
        stringa += "Ruolo" + ruolo +"\n";
        return stringa;
    }
    
}

Nella JDialog ho questi due metodi, uno per inizializzare la comboBox con gli attori ed un altro che dovrebbe restituirmi l'attorore selezionato.

public void inizializzaComboBox() {
        try {
            comboAttori.removeItem("");
            Archivio a = (Archivio) this.vista.getApplicazione().getModello().getBean(Costanti.ARCHIVIO);
            comboAttori.addItem("");
            for (Attore attore : a.getListaAttori()) {
                comboAttori.addItem(attore.getNome() + " " + attore.getCognome());
            }
        }catch (Exception message) {
            logger.info("Errore" + message);
        }

    }
    
    public Attore getAttoreSelezionato (){
        return (Attore) this.comboAttori.getSelectedItem();
    }


Questo è il codice dell'Azione Aggiungi

  public void actionPerformed(ActionEvent e) {
        logger.info("\nEseguo l'azione:\n" + "Classe:"+" "+ this.getClass().getName()+"\n");
        FinestraDettagli fd = (FinestraDettagli) this.applicazione.getVista().getSottoViste(Costanti.FINESTRA_DETTAGLI);
        Modello modello = this.applicazione.getModello();
        String ruolo = fd.getTextRuolo().getText();
        Attore attore = fd.getAttoreSelezionato();
        
        if(attore.equals("")) {
            fd.visualizzaFinestraErrore("Selezionare Un Attore ");
        }else{
        String erroriCarta = this.convalidaCarta(ruolo);
        if(erroriCarta.equals("")) {
                AttoreRuolo ar = new AttoreRuolo(attore,ruolo);
                Film f = (Film) modello.getBean(Costanti.FILM);
                f.aggiungiRuolo(ar);
                
              //  fd.inizializzaComboBox();
                fd.ripulisciCombo();
                fd.inizializzaTabella();
                applicazione.abilitazioniIniziali();
                fd.finestraConferma("Inserito Nuova carta\n" +" " +ar );
                logger.info("\nNuovo Carta Inserita\n");
        }else{
                fd.visualizzaFinestraErrore(erroriCarta);
                logger.error("\nErrore inserimento Carta\n");
            }
        }
    }

    public String convalidaCarta(String ruolo) {
      String errori = "";
      if (ruolo.equals("")) {
          errori += "\n il campo numero Carta non può essere vuoto";
      }
      return errori;
    }
        
}

Quando seleziono un'attore dalla comboBox scrivo il ruolo che ha interpretato e poi clicco su JButton ho questo errore:

Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to it.unibas.esame2107.modello.Attore
Chiamo la Sottovista: it.unibas.esame2107.vista.FinestraDettagli

at it.unibas.esame2107.vista.FinestraDettagli.getAttoreSelezionato(FinestraDettagli.java:65)
at it.unibas.esame2107.controllo.AzioneAggiungi.actionPerformed(AzioneAggiungi.java:32)

In pratica, se non ho capito male, non riesce a fare il cast Attore a String o sbaglio?

Come posso fare per risolvere?

4 Risposte

  • Re: Errore Aggiungi

    CRTVLB ha scritto:


    Exception in thread "AWT-EventQueue-0" java.lang.ClassCastException: java.lang.String cannot be cast to it.unibas.esame2107.modello.Attore
    Chiamo la Sottovista: it.unibas.esame2107.vista.FinestraDettagli
    Nella combo aggiungi stringhe (composte concatenando più cose)
    comboAttori.addItem(attore.getNome() + " " + attore.getCognome());
    Ma qui
    return (Attore) this.comboAttori.getSelectedItem();
    prendi un elemento (quello selezionato) del combo e "tenti" un cast ad Attore. Ovviamente un String NON può essere un Attore.

    Il renderer predefinito per i combo box semplicemente mostra il risultato del toString() sugli oggetti contenuti. Se Attore avesse un toString() appropriato, puoi mettere nel combo direttamente oggetti Attore. Il tuo Attore non ha attualmente un toString() (eredita quello di Object che è poco significativo).


    Nota 1: non è bello mettere nelle stringhe (specialmente quelle dai toString() ) un "\n". La sequenza di newline dipende dalla piattaforma. Anche se prendi dinamicamente la sequenza di newline della piattaforma, comunque non è bellissimo che un toString() dia una stringa che spanna su più righe.

    Nota 2: forse te l'avevo già accennato ma fare cose tipo

    Archivio a = (Archivio) this.vista.getApplicazione().getModello().getBean(Costanti.ARCHIVIO);

    non denota un buon design.
  • Re: Errore Aggiungi

    andbin ha scritto:


    prendi un elemento (quello selezionato) del combo e "tenti" un cast ad Attore. Ovviamente un String NON può essere un Attore.
    Diciamo che avevo avuto il sospetto che dipendesse da quello, ma mi serviva la conferma da uno che ne sa più di me.
    Se Attore avesse un toString() appropriato, puoi mettere nel combo direttamente oggetti Attore. Il tuo Attore non ha attualmente un toString() (eredita quello di Object che è poco significativo).
    Vediamo se ho capito bene se scrivessi
    
    public String attoreNomeCognome() {
            String stringa = "";
            stringa += nome +" " + cognome;
            return stringa;
        }
    
    e poi
    
    public void inizializzaComboBox() {
            try {
                comboAttori.removeItem("");
                Archivio a = (Archivio) this.vista.getApplicazione().getModello().getBean(Costanti.ARCHIVIO);
                comboAttori.addItem("");
                for (Attore attore : a.getListaAttori()) {
                    comboAttori.addItem(attoreNomeCognome());
                }
            }catch (Exception message) {
                logger.info("Errore" + message);
            }
    
        }
    
    Andrebbe bene?

    andbin ha scritto:


    Nota 1: non è bello mettere nelle stringhe (specialmente quelle dai toString() ) un "\n". La sequenza di newline dipende dalla piattaforma. Anche se prendi dinamicamente la sequenza di newline della piattaforma, comunque non è bellissimo che un toString() dia una stringa che spanna su più righe.

    Nota 2: forse te l'avevo già accennato ma fare cose tipo

    Archivio a = (Archivio) this.vista.getApplicazione().getModello().getBean(Costanti.ARCHIVIO);
    Si in effetti me l'avevi già accenato altre volte, ma io ho fatto sempre il questo modo e mi viene automatico fare così. Non saprei proprio come fare diversamente.

    Ovviamente ti ringrazio per l'immenso aiuto che mi stai dando nel comprendere sempre meglio il linguaggio e nell'approccio di come risolvere i problemi che mi si prensentano.
  • Re: Errore Aggiungi

    CRTVLB ha scritto:


    Vediamo se ho capito bene se scrivessi
    
    public String attoreNomeCognome() {
            String stringa = "";
            stringa += nome +" " + cognome;
            return stringa;
        }
    
    e poi
    
                    comboAttori.addItem(attoreNomeCognome());
    
    Andrebbe bene?
    Assolutamente no, non è come ho detto io. Avresti comunque delle stringhe negli item.

    Questo dicevo io: un metodo in Autore

    public String toString()

    (solo questa è la firma esatta per fare l'override del toString di Object!)

    Poi
                for (Attore attore : a.getListaAttori()) {
                    comboAttori.addItem(attore);    // DIRETTAMENTE un oggetto Attore!
                }
    Allora a video nella combo vedi gli elementi che sono il risultato del toString() sugli Autore

    E il selected item è un Autore.
  • Re: Errore Aggiungi

    Scusami hai perfettamente ragione, non ti seguivo perché ero sicuro di aver scritto il metodo
    public String toString() {}
    e non il metodo
    public String toStringAttore() {}
    infatti quando poi inizializzavo la comboBox in questo modo
    
    comboAttori.addItem(attore);
    
    mi usciva nella combo

    progetto.attore

    per quello poi ho pensato di mettere i metodi getNome() + getCognome()

    ora scrivendo il metodo in questo modo:
    
    public String toString() {
          String stringa = "";
          stringa += nome + " " + cognome;
          return stringa;
        }
    
    funziona tutto perfettamente.

    Grazie mille ancora per l'aiuto!
Devi accedere o registrarti per scrivere nel forum
4 risposte