ActionPerformed che mostra label solo dopo ridimensionamento finestra

di il
15 risposte

ActionPerformed che mostra label solo dopo ridimensionamento finestra

Ciao a tutti!
Sto lavorando su un JFrame in cui ho un pulsante per il login. Ho creato il relativo ActionListener e con il metodo ActionPerformed quando l'utente clicca sul button login appare un messaggio di benvenuto. Il funzionamento è tutto ok, fa quello che deve fare, l'unico problema è che il messaggio di benvenuto non compare immediatamente, ma solo quando allargo/restringo la finestra
Qualcuno sa dirmi a cosa è dovuta questa cosa?

Inoltre ho impostato che le text field in cui si immettono email e password dopo aver cliccato sul pulsante di Login diventino vuote, e questa cosa invece succede immediatamente al click, ma il messaggio lo posso vedere solo se ridimensiono la finestra.

15 Risposte

  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    Senza codice è un po' difficile da dire, il problema di cui parli potrebbe verificarsi ad esempio se chiami il setVisible (true) sul jframe prima di aggiungere altri componenti (dovrebbe invece essere sempre l'ultima operazione che eseguì sul frame).

    Altra cosa : usi un layout manager particolare o hai settato a null il layout (non una buona idea nel 99% dei casi) ?

    Inoltre bisognerebbe vedere in quale contesto (EDT o tuo thread) fai le modifiche all'interfaccia, magari dopo aver fatto lavori onerosi, come collegarsi a un database.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    rossociliegia ha scritto:


    l'unico problema è che il messaggio di benvenuto non compare immediatamente, ma solo quando allargo/restringo la finestra
    Qualcuno sa dirmi a cosa è dovuta questa cosa?
    Probabilmente hai fatto qualcosa di inappropriato ... o non hai fatto qualcosa che invece andava fatto. Senza vedere il codice .... non saprei.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    Pensavo ci fosse qualche motivo risaputo, ovviamente errori.
    Comunque posto il codice di tutto:

    Launcher:
    
    package progetto.centroSportivo.business;
    import progetto.centroSportivo.dao.*;
    import progetto.centroSportivo.dbConnection.DbConnection;
    import progetto.centroSportivo.model.*;
    import progetto.centroSportivo.view.*;
    import java.util.*;
    import javax.swing.ImageIcon;
    import javax.swing.JFrame;
    
    public class Launcher {
    
    	public static void main(String[] args) {
    	
    	HomeFrame home = new HomeFrame("Centro Sportivo");
    	home.setVisible(true);
    
    	}
    
    }
    
    Il Frame:
    
    package progetto.centroSportivo.view;
    import java.awt.*;
    import java.util.ArrayList;
    import javax.swing.*;
    import javax.swing.border.*;
    
    import progetto.centroSportivo.model.*;
    import progetto.centroSportivo.actionListener.LoginListener;
    import progetto.centroSportivo.dao.*;
    
    public class HomeFrame extends JFrame{
    	
    	JPanel northPanel = new JPanel();
    	JPanel welcomePanel = new JPanel();
    	private JTextField emailTxt;
    	private JPasswordField passwordTxt;
    	private JButton loginButton;
    	private JButton signupButton;
    	private JTable namesDisciplina;
    	private JScrollPane scrollPane;
    	
    	public JButton getLoginButton()
    	{
    		return loginButton;
    	}
    	public JButton getSignupButton()
    	{
    		return signupButton;
    	}
    	public JPanel getNorthPanel()
    	{
    		return northPanel;
    	}
    	public JTextField getEmailTxt()
    	{
    		return emailTxt;
    	}
    	public JPasswordField getPasswordTxt()
    	{
    		return passwordTxt;
    	}
    	public JTable getNamesDisciplina()
    	{
    		return namesDisciplina;
    	}
    	public JScrollPane getScrollPane()
    	{
    		return scrollPane;
    	}
    	public JPanel getWelcomePanel()
    	{
    		return welcomePanel;
    	}
    	
    	public HomeFrame(String title) throws HeadlessException
    	{	
    		super(title);
    
    		setSize(800,500); 
    		setLocation(400, 50);  
    		setDefaultCloseOperation(EXIT_ON_CLOSE); 
    		
    		loginButton = new JButton("Accedi");
    		signupButton = new JButton("Registrati");
    		northPanel.add(new JLabel("E-mail: ")); 
    		emailTxt = new JTextField(10);
    		northPanel.add(emailTxt);
    		northPanel.add(new JLabel("Password: "));
    		passwordTxt = new JPasswordField(10);
    		northPanel.add(passwordTxt);
    		northPanel.add(loginButton);
    		northPanel.add(signupButton);		
    		getContentPane().add(northPanel, BorderLayout.NORTH);	
    		getContentPane().add(welcomePanel);
    		
    		/* visualizzo le discipline presenti nel db in una JTable */
    		ArrayList<Disciplina> listNamesDiscipline = new ArrayList<Disciplina>();
    		listNamesDiscipline = DisciplinaDAO.showNamesDiscipline();
    		TableNamesDiscipline table = new TableNamesDiscipline(listNamesDiscipline);
    		namesDisciplina = new JTable(table);
    		namesDisciplina.setShowGrid(false);
    		scrollPane = new JScrollPane(namesDisciplina);
            	getContentPane().add(scrollPane, BorderLayout.SOUTH);
            
            LoginListener login = new LoginListener(this);
            loginButton.addActionListener(login);
            
    	}
    
    }
    
    E questo è l'ActionListener:
    package progetto.centroSportivo.actionListener;
    import java.awt.event.*;
    
    import javax.swing.JLabel;
    
    import progetto.centroSportivo.dao.*;
    import progetto.centroSportivo.model.Tesserato;
    import progetto.centroSportivo.view.HomeFrame;
    
    public class LoginListener implements ActionListener{
    	
    	private HomeFrame frame;
    	
    	public LoginListener(HomeFrame frame) 
    	{
    		this.frame = frame;
    	}
    
    	public void actionPerformed(ActionEvent e) 
    	{
    		
    		Object source = e.getSource();
    		if(source == frame.getLoginButton()) 
    		{ 
    			String email = frame.getEmailTxt().getText();
    			String password = new String(frame.getPasswordTxt().getPassword());
    			TesseratoDAO t = new TesseratoDAO();
    			boolean	i = t.isRegistered(email, password);
    			String name = t.findNameByEmailAndPass(email, password);			
    			JLabel welcomeMsg;
    			if(i = true)
    			{
    				if(name != null)
    				{
    					welcomeMsg = new JLabel("Benvenuto  "+name+"!");
    					frame.getWelcomePanel().add(welcomeMsg);
    					frame.getEmailTxt().setText("");
    					frame.getPasswordTxt().setText("");
    				}
    				else 
    				{
    					welcomeMsg = new JLabel("L'email e/o la password non sono corretti!");
    					frame.getWelcomePanel().add(welcomeMsg);
    				}
    			} 
    			
    		}
    	}
    }
    
    Questi i metodi che uso nell'ActionPerformed:
    
    public boolean isRegistered(String email, String password)
    	{	
    		boolean isRegistered = true;
    		ArrayList<String[]> result = DbConnection.getInstance().eseguiQuery("SELECT * FROM tesserato WHERE email='"+email+"' AND pass= '"+password+"' ");
    		if(result.size() == 0) isRegistered = false;
    		return isRegistered;
    	}
    	
    public String findNameByEmailAndPass(String email, String password)
    	{
    		Tesserato t = new Tesserato();
    		ArrayList<String[]> result = DbConnection.getInstance().eseguiQuery("SELECT tesserato.nome FROM tesserato WHERE email='"+email+"' AND pass= '"+password+"' ");
    		if(result.size() == 0) return null;
    		String[] riga = result.get(0);
    		t.setNome(riga[0]);
    		return t.getNome();
    	}
    		
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    rossociliegia ha scritto:


    Pensavo ci fosse qualche motivo risaputo, ovviamente errori.
    Nel LoginListener vai a creare un nuovo JLabel e poi lo aggiungi con

    frame.getWelcomePanel().add(welcomeMsg);

    Quando si modifica strutturalmente un "contenitore" (aggiunte, rimozioni, ecc.. di componenti) DOPO che il contenitore è già stato reso visibile, se c'è un layout manager esso va ri-validato.

    Il welcome panel è un JPanel, non gli hai impostato esplicitamente un layout manager, quindi rimane quello predefinito che è FlowLayout. In tal caso è sufficiente un validate() sul contenitore (il JPanel).
    frame.getWelcomePanel().add(welcomeMsg);
    frame.getWelcomePanel().validate();

    P.S. comunque quello che hai scritto non è affatto buono. Il listener l'hai implementato come classe esterna a HomeFrame. E quindi hai dovuto "esporre" all'esterno parecchie informazioni con quei metodi getLoginButton(), getEmailTxt(), getWelcomePanel() ecc...
    Questo dal punto di vista del "design" è pessimo.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    andbin ha scritto:


    P.S. comunque quello che hai scritto non è affatto buono. Il listener l'hai implementato come classe esterna a HomeFrame. E quindi hai dovuto "esporre" all'esterno parecchie informazioni con quei metodi getLoginButton(), getEmailTxt(), getWelcomePanel() ecc...
    Questo dal punto di vista del "design" è pessimo.
    Mi hanno insegnato a fare così, non è che l'ho sognato di notte.
    Grazie dell'aiuto comunque! Ma non si è risolto il problema, succede anche con il validate().
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    rossociliegia ha scritto:


    Mi hanno insegnato a fare così
    Sappi che se dovrai lavorare un po' più "seriamente" con Swing .... non è quello l'approccio corretto.

    rossociliegia ha scritto:


    Ma non si è risolto il problema, succede anche con il validate().
    Non si è risolto? In che senso? Ma cosa hai scritto, quindi? Io ti ho mostrato un pezzetto di codice. Dopo un add sul contenitore (il tuo welcome panel) va semplicemente fatto un validate() poiché è sufficiente per il FlowLayout del panel. Tutto qui.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    andbin ha scritto:


    Ma cosa hai scritto, quindi? Io ti ho mostrato un pezzetto di codice. Dopo un add sul contenitore (il tuo welcome panel) va semplicemente fatto un validate() poiché è sufficiente per il FlowLayout del panel. Tutto qui.
    Appunto, dopo aver fatto l'add del welcome panel, ho fatto il validate come mi hai scritto tu, ma il problema è identico, il messaggio compare solo dopo aver ridimensionato la finestra.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    rossociliegia ha scritto:


    dopo aver fatto l'add del welcome panel, ho fatto il validate come mi hai scritto tu, ma il problema è identico, il messaggio compare solo dopo aver ridimensionato la finestra.
    Puoi ripostare il listener così come è adesso?
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    andbin ha scritto:


    Puoi ripostare il listener così come è adesso?
    Certo:
    	public void actionPerformed(ActionEvent e) 
    	{
    		
    		Object source = e.getSource();
    		if(source == frame.getLoginButton()) 
    		{ 
    			String email = frame.getEmailTxt().getText();
    			String password = new String(frame.getPasswordTxt().getPassword());
    			TesseratoDAO t = new TesseratoDAO();
    			boolean	i = t.isRegistered(email, password);
    			String name = t.findNameByEmailAndPass(email, password);			
    			JLabel welcomeMsg;
    			if(i = true)
    			{
    				if(name != null)
    				{
    					welcomeMsg = new JLabel("Benvenuto  "+name+"!");
    					frame.getWelcomePanel().add(welcomeMsg);
    					frame.getWelcomePanel().validate();
    					frame.getEmailTxt().setText("");
    					frame.getPasswordTxt().setText("");
    				}
    				else 
    				{
    					welcomeMsg = new JLabel("L'email e/o la password non sono corretti!");
    					frame.getWelcomePanel().add(welcomeMsg);
    					frame.getWelcomePanel().validate();
    				}
    			} 
    			
    		}
    	}
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    Mah .... strano. Visto così mi pare corretto. Vedrò di provare il tuo codice, togliendo/replicando quello che serve (o che non ho).
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    Attenta poi a questa parte:
    
    boolean   i = t.isRegistered(email, password);
    [...]
    if(i = true) {
    [...]
    }
    
    Qui stai facendo un'assegnazione ad i, non stai verificando che sia true, quindi entrerai sempre nel blocco, che "t" sia registrato o meno.
    Puoi fare il confonto con ==, o più semplicemente scrivere:
    
    if (i) {
    [...]
    }
    
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    Ansharja ha scritto:


    Attenta poi a questa parte:
    
    boolean   i = t.isRegistered(email, password);
    [...]
    if(i = true) {
    [...]
    }
    
    Qui stai facendo un'assegnazione ad i, non stai verificando che sia true, quindi entrerai sempre nel blocco, che "t" sia registrato o meno.
    Puoi fare il confonto con ==, o più semplicemente scrivere:
    
    if (i) {
    [...]
    }
    
    Il metodo "isRegistered" restituisce true se il Tesserato è presente nel db e false altrimenti, io assegno questo risultato alla variabile i. A me pare corretto.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    Quello che Ansharja ti ha giustamente fatto notare è che è sbagliata l'istruzione if:
    
    if (i = true) {   // Non è un confronto, è un'assegnazione!
    

    L'istruzione corretta è:
    
    if (i == true) {
    
    oppure (meglio)
    
    if ( i ) {
    

    Ciao.
  • Re: ActionPerformed che mostra label solo dopo ridimensionamento finestra

    LeleFT ha scritto:


    Quello che Ansharja ti ha giustamente fatto notare è che è sbagliata l'istruzione if:
    
    if (i = true) {   // Non è un confronto, è un'assegnazione!
    

    L'istruzione corretta è:
    
    if (i == true) {
    
    oppure (meglio)
    
    if ( i ) {
    

    Ciao.
    Ah ok
Devi accedere o registrarti per scrivere nel forum
15 risposte