Programmare in Java una lista della spesa/Interfaccia grafica (GUI)

La classe listaSpesaGUI gestisce l'interfaccia grafica del programma, in essa viene utilizzata la classe Lista di oggetti Prodotti, precedentemente creata. Tale classe si crea selezionando in Eclipse : File --> New --> Class e digitando il nome della classe listaSpesaGUI . Il metodo public static void main(String[] args) contenuto in questa classe consente l'esecuzione del programma, per cui nel Package Explorer di Eclipse basta cliccare col destro su listaSpesaGUI.java e selezionare Run As --> Java Application per eseguire il programma.


package lista_spesa;

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Arrays;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;


public class ListaSpesaGUI extends JFrame {
    private JTextField txtProdotto;
    private JTextField txtQuantita;
    private JComboBox<String> cmbScaffale, cmbSupermercato;
    private JList<String> lstProdotti;
    private DefaultListModel<String> listModel;
    private JButton btnAggiungi;
    private JButton btnRimuovi;
    private JButton btnSalvaCSV;
    private JButton btnSvuotaLista;
    private Lista listaSpesa;

    //Costruttore classe
    public ListaSpesaGUI() {
        // Impostazioni finestra
        setTitle("Lista della Spesa");
        setSize(1000, 500);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        listaSpesa = new Lista();

        // Layout principale
        JPanel panel = new JPanel(new BorderLayout());
        setContentPane(panel);

        // Pannello superiore per l'input
        JPanel panelInput = new JPanel(new FlowLayout());
        panelInput.add(new JLabel("Prodotto:"));
        panelInput.add(txtProdotto = new JTextField(20));
        panelInput.add(new JLabel("Quantità:"));
        panelInput.add(txtQuantita = new JTextField(5));
        panelInput.add(new JLabel("Scaffale:"));
        String p[] = { "Surgelati","Frutta e Verdura","Frigo","Pasta","Vino",
        		"Dolcino","Casa","Succhi","Latticini","Acqua","Biscotti","Olio,aceto,passate",
        		"Colazione","Condimenti","Detersivi","Sacchetti","Igiene","Altro","Carne","Pane","Pesce"};
        Arrays.sort(p);
        cmbScaffale = new JComboBox<>(p);
        panelInput.add(cmbScaffale);
        panelInput.add(new JLabel("Supermercato:"));
        cmbSupermercato = new JComboBox<>(new String[]{"Lidl", "Conad", "Coop" });
        panelInput.add(cmbSupermercato);


        // Pannello destro per i pulsanti
        JPanel panelButton = new JPanel();
        panelButton.setLayout(new BoxLayout(panelButton,BoxLayout.Y_AXIS));
        panelButton.add(btnAggiungi = new JButton("Aggiungi"));
        panelButton.add(btnRimuovi = new JButton("Rimuovi"));
        panelButton.add(btnSalvaCSV = new JButton("Salva in CSV"));
        panelButton.add(btnSvuotaLista = new JButton("Cancella Lista"));


        panel.add(panelInput, BorderLayout.NORTH);
        panel.add(panelButton, BorderLayout.EAST);

        // Pannello centrale per la lista
        listModel = new DefaultListModel<>();
        lstProdotti = new JList<>(listModel);
        JScrollPane scrollPane = new JScrollPane(lstProdotti);
        panel.add(scrollPane, BorderLayout.CENTER);

        leggiProdotti();

        // Eventi dei pulsanti
        btnAggiungi.addActionListener(e -> {
            String prodotto = txtProdotto.getText();
            String quantita = txtQuantita.getText();
            String scaffale = (String) cmbScaffale.getSelectedItem();
            String supermercato = (String) cmbSupermercato.getSelectedItem();
            listModel.addElement(prodotto + " (" + quantita + ") - " + scaffale+ " - " + supermercato);
            listaSpesa.add(new Prodotto(prodotto,scaffale,supermercato,quantita));
            txtProdotto.setText("");
            txtQuantita.setText("");
        });

        btnRimuovi.addActionListener(e -> {
            int index = lstProdotti.getSelectedIndex();
            if (index != -1) {
                listModel.remove(index);
                listaSpesa.remove(index);
            }
        });


        btnSalvaCSV.addActionListener(e -> {
            salvaInCSV("listaSpesa");
            JOptionPane.showMessageDialog(null, "Lista salvata in listaSpesa.csv");
        });

        btnSvuotaLista.addActionListener(e -> {
        	int result=JOptionPane.showConfirmDialog(null,"Sei sicuro di voler cancellare tutta la lista?", getTitle(), JOptionPane.YES_NO_OPTION);
        	if (result==JOptionPane.YES_OPTION) {
	            listModel.clear();
	            listaSpesa.svuotaLista();
	            salvaInCSV("listaSpesa");
	        	}
        });


        setVisible(true);

    }


    private void salvaInCSV(String nomeFile) {
        try (FileWriter writer = new FileWriter(nomeFile + ".csv")) {
            for (Prodotto prodotto : listaSpesa.getProdotti()) {
                writer.write(prodotto.getNome() + "," + prodotto.getQuantita() + "," + prodotto.getScaffale() + "," + prodotto.getSupermercato()  + "\n");
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    private void leggiProdotti() {
    	listModel.clear();
    	for (Prodotto prodotto : listaSpesa.getProdotti()) {
            listModel.addElement(prodotto.toString());

        }
    }


    public static void main(String[] args) {
        new ListaSpesaGUI();
    }
}