Dubbio sui metodi getters setters nelle gui

di il
6 risposte

Dubbio sui metodi getters setters nelle gui

Salve ragazzi, sono nuovo del forum e questo è il mio primo topic.
Sono un neofita del java, tant'è che l'ho iniziato quest'anno in università.
Ho un paio di dubbi sui metodi getters & setters, in particolar modo sulla Gui: Se costruisco una finestra devo comunque usarli?
Ad esempio, posto il codice che sto usando per costruire la mia "Login Frame":
package vista.finestrelog;

import java.awt.BorderLayout;

import java.awt.Container;
import java.awt.FlowLayout;
import java.awt.GridLayout;

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

import listener.ActionIntro;
import util.Constants;

public class Login_Frame extends JFrame implements Constants {
	
	//Creazione dell'ascoltatore.
	ActionIntro intro =new ActionIntro(this);
	
	private JButton login = new JButton("ACCEDI");//Creazione del pulsante accedi al sistema.
	private JButton pwforgotten = new JButton("PASSWORD DIMENTICATA"); //Creazione del pulsante pw domenticata.
	
	//Creazione dei campi di inersimento.
	private JPasswordField pass= new JPasswordField();
	private JTextField usr= new JTextField();
	private JTextField prg=new JTextField();
	
	//Getters & Setters
	
	public ActionIntro getIntro() {
		return intro;
	}


	public JButton getLogin() {
		return login;
	}

	public JButton getPwforgotten() {
		return pwforgotten;
	}

	public JPasswordField getPass() {
		return pass;
	}

	public JTextField getUsr() {
		return usr;
	}
	
	public JTextField getPrg() {
		return prg;
	}
	


	//Costruttore.
	
	public Login_Frame(){
	super("Finestra di Login");
	//Creazione del contenitore.
	Container c = getContentPane();
	c.setLayout(new BorderLayout()); // Setto il layout del contenitore come un border
	
	
	
	
	//Configurazione dei bottoni e dei pannelli che mi serviranno.
	
	
	
	getPwforgotten().addActionListener(intro);
	getPwforgotten().setActionCommand(ACTION_COMMAND_BTN_PWFORGOTTEN);
	
	
	
	
	//Creazione delle etichette.
	JLabel pw = new JLabel("PASSWORD");
	JLabel user = new JLabel("USERNAME");
	JLabel prog= new JLabel ("PROGETTO");
	
	
	
	
	

	//Creazione dei pannelli.
	JPanel Pnord = new JPanel();
	Pnord.setLayout(new GridLayout(3,2));
	Pnord.setSize(500, 200);
	JPanel Psud = new JPanel();
	Psud.setLayout(new FlowLayout());
	Psud.setSize(300, 300);
	
	//Aggiunta dei bottoni ai pannelli.
	
	Pnord.add(user);
	Pnord.add(getUsr());
	Pnord.add(pw);
	Pnord.add(getPass());
	Pnord.add(prog);
	Pnord.add(getPrg());
	Psud.add(login);
	Psud.add(pwforgotten);
	
	
	
	c.add(Psud, BorderLayout.SOUTH);
	c.add(Pnord, BorderLayout.NORTH);
	
setVisible(true);
setLocation(500, 220);
pack();
	

	}

	
}
In questo caso conviene usare i metodi get? So che servono per preservare l'information hiding, ma in questo caso mi sembra solo uno spreco di prestazioni.

P.S. Lasciate stare la parte del codice riguardo ai size, quella è un'altra battaglia contro al codice che sto combattendo, ed attualmente perdendo.

Grazie mille a tutti.

6 Risposte

  • Re: Dubbio sui metodi getters setters nelle gui

    TKingu ha scritto:


    Ho un paio di dubbi sui metodi getters & setters, in particolar modo sulla Gui: Se costruisco una finestra devo comunque usarli?
    In questo caso conviene usare i metodi get?
    La questione non è tanto l'uso del getter in sé. Siccome quei getter che si vedono nel codice "espongono" principalmente dei componenti, la questione è: PERCHÈ devi esporli? Perché devi esporre il JButton del login con quel getLogin()?
    Immagino già quale potrebbe essere la tua risposta: "espongo il JButton perché dall'esterno voglio registrarci un ActionListener e fare "qualcosa" quando l'utente clicca su ACCEDI".
    Certamente ci devi registrare un ActionListener (altrimenti non ci faresti nulla) ma NON così. Il tuo problema quindi è a livello di "design" delle classi, che è perlomeno inappropriato.

    Nello sviluppo di GUI quando si fa una classe (per finestra, pannello o altro), sarebbe meglio esporre dati o funzionalità ... NON i componenti interni.
  • Re: Dubbio sui metodi getters setters nelle gui

    Innanzitutto di ti ringrazio infinitamente della risposta

    Come detto prima, purtroppo sono un neofita del java, ed essendo il mio primo Linguaggio orientato agli oggetti, non ho molta esperienza al riguardo, quindi non ho ben capito che cosa tu voglia intendere, dovrei quindi togliere il getter del Button?
    Purtroppo è il mio primissimo progetto in java, ho fatto qualche altro programmino giusto per esercitazione sul codice, ma al livello di progettazione, questo è il primo.
    Potresti, gentilmente, essere un po' più chiaro? Purtroppo non ho ben seguito il tuo discorso.. Grazie.
  • Re: Dubbio sui metodi getters setters nelle gui

    TKingu ha scritto:


    Potresti, gentilmente, essere un po' più chiaro? Purtroppo non ho ben seguito il tuo discorso.. Grazie.
    Mettiamola così ... con un esempio abbozzato (non uguale al tuo, ma per farti capire):
    public class LoginFrame extends JFrame {
        private JTextField usernameField;
        private JPasswordField passwordField;
        private JButton loginButton;
    
        public LoginFrame() {
            // ... istanziazioni dei componenti, setup vari sul frame, ecc...
        }
    
        public void addLoginActionListener(ActionListener actionListener) {
            loginButton.addActionListener(actionListener);
        }
    
        public String getUsername() {
            return usernameField.getText();
        }
    
        public char[] getPassword() {
            return passwordField.getPassword();
        }
    
        // altro ....
    }
    Questo sarebbe il minimo fattibile per fare qualcosa di migliore del tuo. Come vedi NON vengono esposti i componenti, né direttamente a livello di field (sono private) né a livello di metodi getter.
    Quello che viene esposto sono i DATI (non i componenti!) come lo username e la password. E poi è esposta la funzionalità per registrare un ActionListener per "ascoltare" la azione sul loginButton.
    Se noti, questi metodi fanno solo da "passacarte". Ma questo è sufficiente per: a) nascondere componenti e implementazione e b) permettere comunque l'accesso ai dati e alla gestione degli eventi.

    Nota: si può fare anche ben meglio di così, ci sono "design" migliori. Ma questo che ti ho mostrato è perlomeno il minimo pensabile e possibile per fare qualcosa di meglio del tuo codice.


    P.S. non è una buonissima cosa implementare una interfaccia solo per "ereditare" delle costanti (quel implements Constants che hai messo). Se invece di dover scrivere ogni volta Constants.XYZ vuoi poter scrivere solo XYZ, allora sfrutta il meccanismo dello "static import" (introdotto in Java 5). Non l'ereditarietà
  • Re: Dubbio sui metodi getters setters nelle gui

    Ti ringrazio tantissimo della risposta, ho capito che cosa intendessi, davvero grazie mille.

    Per la cosa delle costanti, mi è stata consigliata dall'assistente del professore, mi serve per usare l'action lister "dinamicamente" in modo da poterlo scrivere in questo modo
    package listener;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    
    import util.Constants;
    import vista.*;
    import vista.finestrelog.Login_Frame;
    import vista.finestrelog.PwForgotten_Frame;
    
    public class ActionIntro implements ActionListener, Constants {
    	//Creo una istanza di Login_Frame
    	
    	
    	 Login_Frame lframe ; 
    	
    	
    
    
    
    	//Costruttore
    	public ActionIntro(Login_Frame lframe){
    		this.lframe=lframe;
    		
    	}
    	
    	
    //Ora switcio le varie finestre con i vari bottoni. 
    	@Override
    	public void actionPerformed(ActionEvent e) {
    		String get = e.getActionCommand();
    		//String c1= l.getRegister().getActionCommand();
    		
    		
    		
    		switch (get) {
    		
    		
    		case Constants.ACTION_COMMAND_BTN_PWFORGOTTEN: {
    			PwForgotten_Frame w=new PwForgotten_Frame();
    			break;
    		}
    			
    		}
    			
    		
    		
    Qui c'è solo il listener per la pass dimenticata, appena avrò implementato l'interfaccia di login metterò anche quello. Avento intenzione di mettere un solo listener per ogni finestra, e dato che lo switch accetta solo costanti, ho dovuto far così.
    E' tanto sbagliato? :/
  • Re: Dubbio sui metodi getters setters nelle gui

    TKingu ha scritto:


    mi è stata consigliata dall'assistente del professore


    Forse non ci siamo capiti. Se a te basta e va bene scrivere un case così.

    case Constants.ACTION_COMMAND_BTN_PWFORGOTTEN:

    ossia mettere la costante qualificata con la classe, allora l'unica cosa che ti serve è

    import util.Constants;

    ma NON ti serve (ed è concettualmente inappropriato) il implements di Constants !

    Se vuoi usare nel sorgente i nomi delle costanti senza doverli qualificare ogni volta con la classe, allora si può usare lo "static import" (da Java 5 in poi).

    import static util.Constants.ACTION_COMMAND_BTN_PWFORGOTTEN;

    e quindi potrai fare:

    case ACTION_COMMAND_BTN_PWFORGOTTEN:

    Se hai più costanti puoi fare più static import singolarmente o uno solo nella forma "on demand" (con l'asterisco):

    import static util.Constants.*;

    Anche se così si rischia di rendere meno chiaro e più difficile la comprensione del sorgente.

    Quindi: del fatto che non è buona cosa fare una interfaccia "di sole costanti" (e ancor meno buono implementarla poi nelle classi) e che esiste lo static import, il tuo "bravo" assistente ho paura che ne sia del tutto ignaro ....
  • Re: Dubbio sui metodi getters setters nelle gui

    Oh, ecco.
    Ti ringrazio delle dritte che mi hai dato, gentilissimo
Devi accedere o registrarti per scrivere nel forum
6 risposte