Questa è la classe Modello
public class Modello {
private final Map<String,Object> mappaBean = new HashMap<String,Object>();
public Object getBean ( String chiave ) {
return this.mappaBean.get(chiave);
}
public void addBean ( String chiave, Object bean ) {
this.mappaBean.put( chiave, bean );
}
Classe CatenaSupermercati
public class CatenaSupermercati {
private List<Supermercato> listaSupermercati = new ArrayList<Supermercato>();
public void aggiungiSupermercato(Supermercato s){
this.listaSupermercati.add(s);
}
public Supermercato getSupermercato(int i){
return this.listaSupermercati.get(i);
}
public Supermercato getSupermercato(String user){
for (Supermercato s : listaSupermercati) {
if(s.getUser().equals(user)){
return s;
}
}
return null;
}
}
Classe Prodotto
public class Prodotto implements Comparable<Prodotto> {
private String codice;
private String descrizione;
private String categoria;
private double prezzo;
private Supermercato s;
public Prodotto() {}
public Prodotto(String codice, String descrizione, String categoria, double prezzo, Supermercato s) {
this.codice = codice;
this.descrizione = descrizione;
this.categoria = categoria;
this.prezzo = prezzo;
this.s = s;
}
public String getCodice() {
return codice;
}
public void setCodice(String codice) {
this.codice = codice;
}
public String getDescrizione() {
return descrizione;
}
public void setDescrizione(String descrizione) {
this.descrizione = descrizione;
}
public String getCategoria() {
return categoria;
}
public void setCategoria(String categoria) {
this.categoria = categoria;
}
public double getPrezzo() {
return prezzo;
}
public void setPrezzo(double prezzo) {
this.prezzo = prezzo;
}
public String getPrezzoDouble() {
return Double.toString(prezzo);
}
@Override
public String toString() {
return "Prodotto " + codice + " " + descrizione + ", categoria=" + categoria + ", prezzo=" + prezzo;
}
@Override
public int compareTo(Prodotto o) {
if (this.getPrezzo() > o.getPrezzo()) {
return -1;
} else if (this.getPrezzo() < o.getPrezzo()) {
return 1;
}
return 0;
}
public Supermercato getSupermercato() {
return s;
}
public void setSupermercato(Supermercato s) {
this.s = s;
}
}
Classe prodotto Acquistato
public class ProdottoAcquistato {
private Prodotto prodottos;
private int quantita;
public ProdottoAcquistato(Prodotto prodottos, int quantita) {
this.prodottos = prodottos;
this.quantita = quantita;
}
public Prodotto getProdotto() {
return prodottos;
}
public int getQuantita() {
return quantita;
}
}
// Classe Scontrino
ublic class Scontrino {
private String codice;
private Calendar data;
private double totale;
private Supermercato supermercato;
private final List<ProdottoAcquistato> listaProdottiAcquistati = new ArrayList<ProdottoAcquistato>();
public Scontrino() {}
public Scontrino(String codice, Calendar data, double totale) {
this.codice = codice;
this.totale = totale;
this.data = data;
this.data.setLenient(false);
this.data.getTime();
}
public String getCodice() {
return supermercato.getScontrino();
}
public void setCodice(String codice) {
this.codice = codice;
}
public double getTotale() {
return calcolaTotale();
}
public void setTotale(double totale) {
this.totale = totale;
}
public Calendar getData() {
return data;
}
public void setData(Calendar data) {
this.data = data;
}
public List<ProdottoAcquistato> getListaProdotti() {
return listaProdottiAcquistati;
}
public void aggiungiProdottoAcquistato(ProdottoAcquistato p) {
this.listaProdottiAcquistati.add(p);
}
public void rimuoviProdottoAcquistato(ProdottoAcquistato p) {
this.listaProdottiAcquistati.remove(p);
}
public double calcolaTotale() {
double totale = 0.0;
for (ProdottoAcquistato prodottoAcquistato : listaProdottiAcquistati) {
totale += prodottoAcquistato.getQuantita() * prodottoAcquistato.getProdotto().getPrezzo();
}
return totale;
}
@Override
public String toString() {
return "Scontrino {" + "Codice:" + getCodice() + "Data:" + data + "Lista Prodotti" + listaProdottiAcquistati + "Totale:" + calcolaTotale();
}
}
// Classe supermercato
public class Supermercato {
private String nome;
private String via;
private String città;
private String cap;
private String user;
private String password;
private String telefono;
private List<Prodotto> listaProdottoSupermercato = new ArrayList<Prodotto>();
private List<Scontrino> listaScontrini = new ArrayList<Scontrino>();
public Supermercato() {}
public Supermercato(String nome, String via, String città, String cap, String telefono, String user, String password) {
this.nome = nome;
this.via = via;
this.città = città;
this.cap = cap;
this.telefono = telefono;
this.user = user;
this.password = password;
}
public String getNome() {
return nome;
}
public void setNome(String nome) {
this.nome = nome;
}
public String getVia() {
return via;
}
public void setVia(String via) {
this.via = via;
}
public String getCittà() {
return città;
}
public void setCittà(String città) {
this.città = città;
}
public String getCap() {
return cap;
}
public void setCap(String cap) {
this.cap = cap;
}
public String getUser() {
return user;
}
public void setUser(String user) {
this.user = user;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getTelefono() {
return telefono;
}
public void setTelefono(String telefono) {
this.telefono = telefono;
}
public List<Prodotto> getListaProdottiSupermercato() {
return listaProdottoSupermercato;
}
public List<Scontrino> getListaScontrini() {
return listaScontrini;
}
public void setListaScontrini(List<Scontrino> listaScontrini) {
this.listaScontrini = listaScontrini;
}
public void aggiungiProdotto(Prodotto pa) {
this.listaProdottoSupermercato.add(pa);
}
public void setListaProdotti(List<Prodotto> listaProdottoSupermrcato) {
this.listaProdottoSupermercato = listaProdottoSupermercato;
}
public void aggiungiScontrino(Scontrino s) {
this.listaScontrini.add(s);
}
public Prodotto getProdotto(String codiceProdotto) {
for (Prodotto prodotto : listaProdottoSupermercato) {
if(prodotto.getCodice().equals(codiceProdotto)){
return prodotto;
}
}
return null;
}
public String getScontrino() {
StringBuilder sb = new StringBuilder();
sb.append(nome.substring(0, 3));
sb.append(città.substring(0, 3));
sb.append(cap);
sb.append("-");
sb.append(0000+listaScontrini.size()-1);
return sb.toString().toUpperCase();
}
}
Spiego anche brevemente il funzionamento del programma, in pratica voglio gestire una catena di supermercati, ogni supermercato dopo aver effettuato il login con il proprio user e password può effettuare una serie di operazioni, come l'emissione di un nuovo scontrino o la ricerca dello scontrino con l'importo massimo o minimo oppure visualizzare tutti gli scontrini emessi con l'importo superiore o inferiore a quello cercato.
Queste operazioni avvengono tutte tramite previa seleziona da una button group, ecco qui mi si presenta l'errore, seleziono dalla buttonGroup quello che voglio fare, clicco sul pulsante che dovrebbe permettermi di attivare l'azione e si verifica un java.lang.NullPointerException.
Stessa cosa quando provo ad aggiungere un prodotto allo scontrino, seleziono il codice del prodotto da una comboBox e quando clicco sul pulsante aggiungi ecco di nuovo una java.lang.NullPointerException.
// Queste sono le azioni
Azione Aggiungi
public class AzioneAggiungiProdotto extends AbstractAction {
private Applicazione applicazione;
private Logger logger = (Logger) LoggerFactory.getLogger(AzioneAggiungiProdotto.class);
public AzioneAggiungiProdotto(Applicazione applicazione) {
this.applicazione = applicazione;
this.putValue(NAME, "Aggiungi");
this.putValue(SHORT_DESCRIPTION, "Aggiunge Il Prodotto Selezionato Allo Scontrino");
this.putValue(MNEMONIC_KEY, KeyEvent.VK_A);
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke(" alt a"));
}
public void actionPerformed(ActionEvent e) {
PannelloPrincipale pp = (PannelloPrincipale) this.applicazione.getVista().getSottoViste(Costanti.PANNELLO_PRINCIPALE);
String stringaQuantita = pp.getTextQuantità();
String codiceProdotto = (String) pp.getComboProdotti().getSelectedItem();
String errori = convalidaDati(stringaQuantita, codiceProdotto);
if (!errori.isEmpty()) {
pp.finestraErrore("Si è verificato il seguente errore:",errori);
return;
}
Supermercato supermercato = (Supermercato) this.applicazione.getModello().getBean(Costanti.SUPERMERCATO);
Scontrino scontrino = (Scontrino) this.applicazione.getModello().getBean(Costanti.SCONTRINO);
int quantita = Integer.parseInt(stringaQuantita);
Prodotto prodotto = supermercato.getProdotto(codiceProdotto);
ProdottoAcquistato prodottoAcquistato = new ProdottoAcquistato(prodotto, quantita);
// scontrino.aggiungiProdottoAcquistato(prodottoAcquistato);
pp.aggiornaDatiScontrino();
// pp.mostraProdotti((List<ProdottoAcquistato>) prodottoAcquistato);
pp.resettaCampi();
}
private String convalidaDati(String stringaQuantita, String codiceProdotto) {
String errori = "";
if (stringaQuantita.isEmpty()) {
errori += "La quantità è¨ obbligatoria\n";
} else {
try {
int quantita = Integer.parseInt(stringaQuantita);
if (quantita <= 0) {
errori += "La quantita' dev'essere un numero maggiore di zero\n";
}
} catch (NumberFormatException ne) {
errori += "La quantita' dev'essere un numero intero\n";
}
}
if (codiceProdotto.isEmpty()) {
errori += "Il codice del prodotto e' obbligatorio\n";
}
return errori;
}
}
l'errore me lo riporta questa linea di codice
Scontrino scontrino = (Scontrino) this.applicazione.getModello().getBean(Costanti.SCONTRINO);
//Azione Trova
public class AzioneTrova extends AbstractAction{
private Applicazione applicazione;
private Logger logger = (Logger) LoggerFactory.getLogger(AzioneTrova.class);
public AzioneTrova(Applicazione applicazioen) {
this.applicazione = applicazione;
this.putValue(NAME, "Esegui");
this.putValue(SHORT_DESCRIPTION, "Esegui La Scelta");
this.putValue(MNEMONIC_KEY, KeyEvent.VK_T);
this.putValue(ACCELERATOR_KEY, KeyStroke.getKeyStroke("alt t"));
}
public void actionPerformed(ActionEvent e) {
logger.info("\nCerco Gli Spot\n" + "Classe:" + " " + this.getClass().getName()+"\n");
try {
AnalizzaScontrino as = (AnalizzaScontrino) this.applicazione.getModello().getBean(Costanti.ANALIZZATORE);
PannelloPrincipale pp = (PannelloPrincipale) this.applicazione.getVista().getSottoViste(Costanti.PANNELLO_PRINCIPALE);
FinestraRicerca fr = (FinestraRicerca) this.applicazione.getVista().getSottoViste(Costanti.FINESTRA_RICERCA);
Scontrino scontrino = (Scontrino) this.applicazione.getModello().getBean(Costanti.SCONTRINO);
String tipo = pp.bottoneSelezionato();
String prezzoSup = pp.getTextParametro();
if (tipo.equals("")) {
JOptionPane.showMessageDialog(pp, "Selezionare un'Azione");
}
if (tipo.equals("m")) {
scontrino = as.cercaMax();
fr.setLabelCodice(scontrino.getCodice());
fr.setLabelData(String.valueOf(scontrino.getData()));
fr.setLabelTotale(String.valueOf(scontrino.getTotale()));
fr.setVisible(true);
logger.info("\nScontrino Max\n"+""+this.getClass().getName()+"\n");
logger.info("\nRicerca Eseguita Con Successo\n" + "Classe:" + " " + this.getClass().getName()+"\n");
pp.ripulisciRadioButton();
}else if (tipo.equals("i")) {
scontrino = as.cercaMin();
fr.setLabelCodice(scontrino.getCodice());
fr.setLabelData(String.valueOf(scontrino.getData()));
fr.setLabelTotale(String.valueOf(scontrino.getTotale()));
fr.setVisible(true);
logger.info("\nScontrino Min\n"+""+this.getClass().getName()+"\n");
logger.info("\nRicerca Eseguita Con Successo\n" + "Classe:" + " " + this.getClass().getName()+"\n");
pp.ripulisciRadioButton();
}else if (tipo.equals("o")) {
if(prezzoSup.isEmpty()){
this.applicazione.getVista().finestraErrore("Attenzione il prezzo non può essere nullo");
}else{
Double prezzo = Double.parseDouble(prezzoSup);
as.cercaMaxSup(prezzo);
logger.info("\nScontrini con prezzo Max di un prezzo dato\n"+""+this.getClass().getName()+"\n");
logger.info("\nRicerca Eseguita Con Successo\n" + "Classe:" + " " + this.getClass().getName()+"\n");
pp.ripulisciRadioButton();
}
}else if (tipo.equals("d")) {
if(prezzoSup.isEmpty()){
this.applicazione.getVista().finestraErrore("Attenzione il prezzo non può essere nullo");
}else{
Double prezzo = Double.parseDouble(prezzoSup);
as.cercaMinSup(prezzo);
logger.info("\nScontrini con prezzo Max di un prezzo dato\n"+""+this.getClass().getName()+"\n");
logger.info("\nRicerca Eseguita Con Successo\n" + "Classe:" + " " + this.getClass().getName()+"\n");
pp.ripulisciRadioButton();
}
}else if (tipo.equals("s")) {
scontrino = new Scontrino();
scontrino.setData(new GregorianCalendar());
pp.aggiornaDatiScontrino();
applicazione.abilitaAzione(Costanti.AZIONE_AGGIUNGI_PRODOTTO);
applicazione.abilitaAzione(Costanti.AZIONE_ELIMINA_PRODOTTO);
}else{
this.applicazione.getVista().finestraErrore("--ATTENZIONE--");
}
}catch (Exception cause) {
logger.error("errore"+ cause);
logger.info("si è verificato il seguente errore" + cause);
}
}
l'errore ce l'ho a questa riga
Scontrino scontrino = (Scontrino) this.applicazione.getModello().getBean(Costanti.SCONTRINO);
Poi ho anche notato che se faccio il login con un supermercato dopo aver effettuato il logout entro con le credenziali di un altro supermercato la comboBox carica i codici di tutti e due i supermercati. Questo credo sia risolvibile svuotando la listaProdottiSupermercato quando effetto il ogout(Come si fa a svuotarla tutta)?
Per gli altri problemi credo che forse dipenda che al login il programma non riesca a capire su quale supermercato effettuare le ricerche, ma non sono sicuro.
Spero che sia tutto chiaro e di non aver incasinato troppo il post.