Progettazione Software

di il
8 risposte

Progettazione Software

Buon giorno e buona Domenica a tutti...
Da qualche giorno sto cercando di capire come si progetta un software con interfaccia grafica, usando il paradigma MVC.
Ho dato uno sguardo in rete, ed ho trovato un esempio molto pratico,che voglio riprenere, ma con qualche modifica, tipo aggiungere un interfaccia grafica.
L'app funziona cosi
un pulsante ti permette di vedere i dati
un pulsanti ti fa settare i dati
Di default, finchè non viene premuto un pulsante, il frame non visualizza niente
Nel senso che i "dati" sono contenuti in un jpanel, e questo viene visualizzato solo quando si clicca sul pulsante per vedere i dati.
L'altro pulsante mostra invece un Jpanel con i componenti x settare i dati.
Io ho creato due modelli auto e persona , e la parte view.
Il controller cmq dovrebbe avere solo dei comportamenti che mi settano i modelli.

//MODEL
public class Auto {
	String modello;
	int matricola;
	boolean disponibile;
	
	public void setModello(String nuovoModello){
		modello = nuovoModello;
	}
	public void setMatricola(int nuovaMatricola){
		matricola = nuovaMatricola;
	}
	public void setDisponibile(boolean nuovoDisponibile){
		disponibile = nuovoDisponibile;
	}
	public String getModello(){
		return modello;
	}
	public int getMatricola(){
		return matricola;
	}
	public boolean getDisponibile(){
		return disponibile;
	}
}

//MODEL
public class Conducente {
	String nome = "Nessun nome ";
	int matricola = 0;
	boolean pagato = false;

	public void setNome(String nuovoNome){
		nome = nuovoNome;
	}
	public String getNome(){
		return nome;
	}
	public void setMatricola(int nuovaMatricola){
		matricola = nuovaMatricola;
	}
	public int getMatricola(){
		return matricola;
	}
	public void setPagato(boolean nuovoPagamento){
		pagato = nuovoPagamento;
	}
	public boolean getPagato(){
		return pagato;
	}
}

//CONTROLLER
public class Controller {
	
}

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

//VIEW
public class Interfaccia extends JFrame implements ActionListener{
	JLabel nome = new JLabel(new Conducente().getNome());
	JLabel matricola = new JLabel(String.valueOf(new Conducente().getMatricola()));
	JLabel pagamento = new JLabel();
	JLabel modelloAuto = new JLabel(new Auto().getModello());
	JLabel matricolaAuto = new JLabel(String.valueOf(new Auto().getMatricola()));
	JLabel disponibilita = new JLabel();
	JPanel pannelloEtichette = new JPanel();
	public Interfaccia(){
		setSize(500,500);
		setDefaultCloseOperation(EXIT_ON_CLOSE);
		getContentPane().setBackground(Color.WHITE);
		
		JButton inserisci = new JButton("INSERISCI NUOVO DATO");
		inserisci.addActionListener(this);
		JButton cerca = new JButton("CERCA DATO");
		cerca.addActionListener(this);
		JPanel pannelloButton = new JPanel();
		
		if(new Conducente().getPagato() == true ){
			pagamento.setText("Pagato");
		}else{
			pagamento.setText("Non Pagato");
		}
		
		if(new Auto().getDisponibile() == true){
			disponibilita.setText("Disponibile");
		}else{
			disponibilita.setText("Non disponibile");
		}
		pannelloButton.setLayout(new FlowLayout());
		pannelloButton.add(inserisci);
		pannelloButton.add(cerca);
		add(pannelloButton,BorderLayout.NORTH);
	}

	@Override
	public void actionPerformed(ActionEvent event) {
		if(event.getActionCommand().equals("INSERISCI NUOVO DATO")){
			pannelloEtichette.add(nome);
			pannelloEtichette.add(matricola);
			pannelloEtichette.add(pagamento);
			pannelloEtichette.add(modelloAuto);
			pannelloEtichette.add(matricola);
			pannelloEtichette.add(disponibilita);
			pannelloEtichette.setLayout(new FlowLayout());
			getContentPane().add(pannelloEtichette,BorderLayout.CENTER);
			System.out.println("Click nuovo Dato");	
		}
	}
}
Non riesco a visualizzare il pannello etichette cliccando sul bottone
Nel main faccio partire
Interfaccia lancia = new Interfaccia();
setVisible(true);

8 Risposte

  • Re: Progettazione Software

    Il setVisible(true) in actionPerformed();
    Cosi funzione...
    Di default dovrebbe essere true..
  • Re: Progettazione Software

    Ciao
    Domanda, i component, ad esempio un JButton, vanno scritti tra gli attributi, o nel costruttore??.
    Se li aggiungi tra gli attributi, puoi visualizzarli in altre classi del package, se invece li aggiungi nel costruttore, mi pare di capire, che la sua visibilità è racchiusa tra le graffe del costruttore.
    Però sono certo che un modo per aver un riferimento, esiste.
    La mia domanda è,
    ma un component, come ad esempio un JButton,JPanel ecc
    va visto come
    un attributo e quindi va scritto tra gli attributi,
    oppure fa parte del costruttore, e quindi scritto nel costruttore??
    Nel costruttore io lo vedo come una sorta di mattoncino, per costruire la finestra. E la finestra è il pacchetto completo con parametri chiusi.
    Ma scritto tra gli attributi, mi sembtra, un elemento dell' oggetto, quindi un attributo dell'oggetto stesso. In questo caso l'oggeto non è chiuso.
    Modificabile da altri oggetti.
    Intendo i component dell'oggetto
    Anche se un Jcomponet è un oggetto
  • Re: Progettazione Software

    Alexxandro ha scritto:


    i component, ad esempio un JButton, vanno scritti tra gli attributi, o nel costruttore??.
    Se li aggiungi tra gli attributi, puoi visualizzarli in altre classi del package, se invece li aggiungi nel costruttore, mi pare di capire, che la sua visibilità è racchiusa tra le graffe del costruttore.
    Tra gli attributi, ovvero le variabili "di istanza", ci tieni i dati che tu sai che serviranno anche dopo che l'oggetto è stato istanziato e inizializzato (cioè dopo che il costruttore ha concluso). Hai un JTextField che dovrà essere usato anche successivamente a seguito di un evento? Questo lo terrai come variabile di istanza. Hai un JLabel di cui non ti interessa farci nulla in seguito? Lo tieni come variabile locale al costruttore fin tanto che basta per impostarlo e inserirlo dove serve.
    Lo devi stabilire tu.
  • Re: Progettazione Software

    Vederli come variabili locali, o d'istanza rende l'idea più definita ahahah.
    La questione è che se volessi lasciare i mie component nel costruttore, come faccio poi a trovare un riferimento a loro??
    c'è una funzione tipo getContentPane oppure mi devo arrangiare copiando i riferimenti in altre variabili?
  • Re: Progettazione Software

    Alexxandro ha scritto:


    La questione è che se volessi lasciare i mie component nel costruttore, come faccio poi a trovare un riferimento a loro??
    L'ho detto prima: se davvero servono anche successivamente alla esecuzione del costruttore, allora devono far parte dello "stato" dell'oggetto e quindi essere referenziati da variabili "di istanza".
  • Re: Progettazione Software

    Ok---
    Ho capito questo...
    Ma se io volessi avere un riferimento ad un component costruito nel costruttore, come faccio??
    Questo praticamente è visibile solo all'interno delle graffe, in locale.
    Però essendo un componente di un interfaccia, penso ci sarà un modo per far ritornare un indirizzo di memoria di questo component.
    Grazie andbin
  • Re: Progettazione Software

    Alexxandro ha scritto:


    Ma se io volessi avere un riferimento ad un component costruito nel costruttore, come faccio??
    Questo praticamente è visibile solo all'interno delle graffe, in locale.
    Però essendo un componente di un interfaccia, penso ci sarà un modo per far ritornare un indirizzo di memoria di questo component.
    Tecnicamente sì, ma bisogna "sapere" che ad esempio un JTextField è il secondo componente dentro un JPanel che è il terzo componente nel content pane.
    Facendo un po' di getComponent(int n) sui contenitori più eventuali cast a tipi specifici, ci si arriva ... certo. Le interfacce grafiche, detto in generale, sono strutturalmente un "albero di componenti" (un contenitore ha N componenti che possono essere altri contenitori con dentro ecc...). E ci sono tutti i metodi per navigarci dentro.

    Ma tutto questo non ha senso, non serve e NON si fa. Potrebbe aver senso navigare in modo "dinamico" (e magari in tutta la profondità) solo in casi davvero molto particolari, tipo: dato un JFrame voglio fare un "dump" (per debugging, verifica, studio, ecc..) di tutto l'albero di componenti contenuto. Questo può avere senso. Ma altrimenti no. Non inventiamo pippe mentali dove non se ne dovrebbero fare ...

    Se fai una classe che estende es. JFrame (quindi è una finestra), allora tieni come variabili di istanza i componenti, model, dati ecc.. che sai che ti serviranno durante la vita della finestra. Tanto comunque sono e dovrebbero restare "privati" i campi. E specialmente i componenti non dovresti mai esporli all'esterno.
    Insomma, la struttura del frame la sai tu che scrivi la classe e la fai in modo che sia appropriata e logica da implementare. Stop, tutto qui.
  • Re: Progettazione Software


    E lo so hai ragione, però poi mi diventa un tarlo nella testa.
    Con MVC sono bloccato.
    Non ho capito bene come funziona
    Questo è il codice.
    L'idea iniziale non me la ricordo più ahaha. Però mi sono i rimasti i nome delle variabili.
    Diciamo che
    ci sono una persona(Conducente) e una vettura(Auto)
    questi sono i due modelli.
    
    /MODEL
    	/*QUESTO MODELLO E' UN OGGETTO DI TIPO CONDUCENTE.
    	 * UN CONDUCENTE PUO' NOLEGGIARE UN AUTO.
    	 * IL SUOI ATTRIBUTI SONO UN:
    	 * NOME string
    	 * ID (QUESTO NUMERO IDENTIFICA L'AUTO CHE HA NOLEGGIATO ) id
    	 * PAGATO boolean
    	 * CI SONO METODI 
    	 * SET E METODI GET PER LE 3 VARIABILI
    	 */
    public class Conducente {
    	private String nome = "Nessun nome ";
    	private int autoID = 0;  
    	private boolean pagato = false;
    
    	public void setNome(String nuovoNome){
    		nome = nuovoNome;
    	}
    	public String getNome(){
    		return nome;
    	}
    	public void setAutoID(int aggiungiID){
    		autoID = aggiungiID;
    	}
    	public int getAutoID(){
    		return autoID;
    	}
    	public void setPagato(boolean statoPagamento){
    		pagato = statoPagamento;
    	}
    	public boolean getPagato(){
    		return pagato;
    	}
    }
    
    
    /* AUTO HA 3 ATTRIBUTI:
     * MODELLO (TIPO DI VETTURA)
     * ID (QUESTO NUMERO IDENTIFICA LA MACCHINA)
     * DIPONIBILE (SE LA VETTURA E' NELLA RIMESSA AUTOVEICOLI
     * METODI SET E GET PER TUTTI GLI ATTRIBUTI
     */
    
    public class Auto {
    	private String modello;
    	private int autoID;
    	private boolean disponibile;
    	
    	public void setModello(String nuovoModello){
    		modello = nuovoModello;
    	}
    	public String getModello(){
    		return modello;
    	}
    	public void setAutoID(int aggiungiID){
    		autoID = aggiungiID;
    	}
    	public int getAutoID(){
    		return autoID;
    	}
    	public void setDisponibile(boolean disponibile){
    		this.disponibile = disponibile;
    	}
    
    	public boolean getDisponibile(){
    		return disponibile;
    	}
    }
    
    
    /* IL CONTROLLORE 
      * RICEVE 3 AOGGETTI NEL COSTRUTTORE
     * IL CONDUCENTE, L'AUTO E L'INTERFACCIA.
     * HA TUTTI I METODI SET E GET PER GLI ATTRIBUTI
     * E DUE METODI
     * INSERISCI DATI
     * CERCA DATI
     */
    public class Controller {
    	private Conducente modelConducente;
    	private Auto modelAuto;
    	private Interfaccia viewInterfaccia;
    	
    	public Controller(Conducente modelConducente, Auto modelAuto, Interfaccia viewInterfaccia){
    		this.modelConducente = modelConducente;
    		this.modelAuto = modelAuto;
    		this.viewInterfaccia = viewInterfaccia;
    	}
    	
    	public void setNomeConducente(String nome){
    		modelConducente.setNome(nome);
    	}
    	public String getNomeConducente(){
    		return modelConducente.getNome();
    	}
    	public void setAutoIDConducente(int id){
    		modelConducente.setAutoID(id);
    	}
    	public int getAutoIDConducente(){
    		return modelConducente.getAutoID();
    	}
    	public void setPagatoConducente(boolean pagamento){
    		modelConducente.setPagato(pagamento);
    	}
    	public boolean getPagatoConducente(){
    		return modelConducente.getPagato();
    	}
    	///////////////////////////////////////////
    	public void setModelloAuto(String modello){
    		modelAuto.setModello(modello);
    	}
    	public String getModelloAuto(){
    		return modelAuto.getModello();
    	}
    	public void setIdAuto(int id){
    		modelAuto.setAutoID(id);
    	}
    	public int getIdAuto(){
    		return modelAuto.getAutoID();
    	}
    	public void setDisponibile(boolean disponibilita){
    		modelAuto.setDisponibile(disponibilita);
    	}
    	public boolean getDisponibile(){
    		return modelAuto.getDisponibile();
    	}
    	///////////////////////////////////////////
    	
    	public void inserisciDati(){
    		
    	}
    	public void cercaDati(){
    		
    	}
    		
    }
    
    
    /* L'INTERFACCIA E' COMPOSTA DA
     * 2 BOTTONI:
     * INSERISCI ( INSERISCI IL DATO )
     * CERCA (RICERCA UN DATO)
     * E' PRESENTE UN BOTTONE SALVA
     * PER SALVARE I DATI, NEGLI ATTRIBUTI DELL'OGGETTO
     * 
     */
    import java.awt.BorderLayout;
    import java.awt.FlowLayout;
    import java.awt.GridLayout;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JTextField;
    
    public class Interfaccia extends JFrame implements ActionListener {
    	private int LARG = 500;
    	private int ALTE = 500;
    	private JPanel pnlCentro = new JPanel();
    	public Interfaccia(){
    		super("Prova");
    		JPanel pnlAlto = new JPanel();
    		JPanel pnlBasso = new JPanel();
    		JButton btnInserisci = new JButton("INSERISCI");
    		JButton btnCerca = new JButton("CERCA");
    		JButton btnSalva = new JButton("Seva");
    		JTextField insNome = new JTextField("Nome");
    		JTextField insIdAuto = new JTextField("id Auto");
    		JTextField insPagamento = new JTextField("Pagamento");
    		JTextField insModello = new JTextField("Modello auto");
    		JTextField insDisponibilita = new JTextField("Disponibilita");
    		
    		setLayout(new BorderLayout());
    		setSize(LARG,ALTE);
    		
    		pnlAlto.setLayout(new FlowLayout());
    		pnlAlto.add(btnInserisci);
    		btnInserisci.addActionListener(this);
    		pnlAlto.add(btnCerca);
    		btnCerca.addActionListener(this);
    		add(pnlAlto,BorderLayout.NORTH);
    		
    		pnlCentro.setLayout(new GridLayout(5,1));
    		pnlCentro.add(insNome);
    		pnlCentro.add(insModello);
    		pnlCentro.add(insDisponibilita);
    		pnlCentro.add(insIdAuto);
    		pnlCentro.add(insPagamento);
    		pnlCentro.setVisible(false);
    		add(pnlCentro,BorderLayout.CENTER);
    		
    		pnlBasso.add(btnSalva);
    		btnSalva.addActionListener(this);
    		add(pnlBasso,BorderLayout.SOUTH);
    		
    		setDefaultCloseOperation(EXIT_ON_CLOSE);
    		System.out.println(pnlCentro.toString());
    	}
    
    	@Override
    	public void actionPerformed(ActionEvent actevt) {
    		if(actevt.getActionCommand().equals("INSERISCI")){
    			pnlCentro.setVisible(true);
    			System.out.println("Premuto pulsante: INSERISCI");
    		}
    		
    	}
    }
    
    
    public class Start {
    
    	public static void main(String[] args) {
    		Interfaccia Start = new Interfaccia();
    		Start.setVisible(true);
    	}
    }
    
    Manca la gestione del bottone Cerca, perchè son voluto passare avanti.
    Mi sono bloccato proprio nei punti salienti.
    Forse non mi è molto chiaro MVC
    Praticamente non so come gestire la situazione
    Come faccio a farli funzionare??
    Questo è un esempio scopiazzato, ma personalizzato abbastanza, con tanto d'interfaccia grafica, quindi magari di base c'è da fare qualche modifica.
    La figura del libro indica che
    il modello vieno manipolato dal controllore
    e poi invia i dati alla vista.
    A questo punto mi sembra di capire che
    devo eliminare i metodi get dal controllore e lasciare solo i set
    e poi elminare i metodi set dall'interfaccia, e lasciare solo i get
    ...
Devi accedere o registrarti per scrivere nel forum
8 risposte