Visualizzazione dei risultati da 1 a 8 su 8

Discussione: problema update JFrame

  1. #1

    problema update JFrame

    ciao a tutti ragazzi
    allora ho un problema con un piccolo programma JAVA che sto scrivendo per far pratica con le GUI Swing.

    codice:
    import javax.swing.*;
    import java.awt.*;
    import java.awt.event.*;
    
    
    public class GestoreFrame extends JFrame
    {
    	//creazione entità grafiche:
    	JMenuBar menu = new JMenuBar();
    	JMenu m1 = new JMenu ("primo");
    	JMenu m2 = new JMenu ("secondo");
    	JMenuItem i1 = new JMenuItem ("oggetto 1");
    	JMenuItem i2 = new JMenuItem ("oggetto 2");
    
    	JPanel pannello = new JPanel();
    	JLabel p1 = new JLabel();
    	JLabel p2 = new JLabel();
    	JButton bottone1 = new JButton("bottone");
    
    
    	public GestoreFrame()
    	{
    		//creazione frame
    		super();
    		this.setSize(800,600);
    		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    		this.setVisible(true);
    
    		//creazione menu
    		this.setJMenuBar(menu);
    		menu.add(m1);
    		menu.add(m2);
    		m1.add(i1); m2.add(i2);
    
    		//creazione pannello
    		pannello.setLayout(new FlowLayout());
    		pannello.setBackground(java.awt.Color.GREEN);
    		this.add(pannello);
    
    		//personalizzazione label
    		p1.setText("prima label");
    		p2.setText("seconda label");
    
    		//associazione degli eventi
    		Ascoltatore a = new Ascoltatore();
    		i1.addActionListener(a);
    		i2.addActionListener(a);
    	}
    
    
    	public class Ascoltatore implements ActionListener
    	{
    		public void actionPerformed(ActionEvent e)
    		{
    			Object sorgente = e.getSource();
    			if	(sorgente==i1)	{ pannello.add(bottone1); }
    			else if	(sorgente==i2)	{ pannello.add(p2); 	    }
    		}
    	}
    
    
    }
    questa è la mia classe, che istanzio nel main (non posto qui perchè non faccio altre che creare un nuovo oggetto GestoreFrame).
    Il frame ha un piccolo menu a tendina in alto, e ho associato alle voci di questo menu delle azioni. vorrei che al click di una delle voci mi apparisse un pulsante sul JPanel.
    il problema è questo: cliccando sulla voce, non appare niente, ma appena ridimensiono anche di un px il Frame (con il mouse, in windows, non da programma!) allora compare il pulsante, e così via per ogni cambiamento che apporto al Frame all'interno del metono actionPerformed.

    sicuramente mi sfugge qualcosa.
    dove sbaglio?
    vi ringrazio in anticipo

  2. #2
    Alla fine dell'action performed dei richiamare il metodo repaint sul frame in modo che venga aggiornata la gui.

  3. #3
    ti ringrazio.
    sai dirmi come posso riferirmi al Frame dalla classe interna? chiaramente il this non funziona perchè mi riferirei ad Ascoltatore, se non sbaglio

  4. #4
    Due soluzioni, o passi la referenza della tuo frame (this) alla classe Ascoltatore, oppure dichiari un metodo all'interno della classe GestioneFrame:
    codice:
    public void aggiorna()
    {
    	this.repaint();
    }
    e poi dalla classe ascoltatore richiami tale metodo.

  5. #5
    ho provato a fare con il metodo aggiorna, richiamandolo subito dopo l'operazione di add (e poi ho provato a metterlo a fine di ActionPerformed, ma niente il pulsante e l'etichetta non si aggiungono, a meno che non smuovo il frame

  6. #6
    prova a richiamalo anche su pannello.
    Se neanche così funziona allora richiama il setVisible(true) sul jframe

  7. #7
    perfetto! ci voleva il setVisible sul JFrame, ho provato e posso anche evitare la chiamata di repaint.

    Due soluzioni, o passi la referenza della tuo frame (this) alla classe Ascoltatore
    ora se non chiedo troppo, sapresti dirmi come si fa questa cosa? non mi viene in mente niente

  8. #8
    Se non sai come passare una referenza ad un oggetto mi sa che farai poca strada.
    Cmq, aggiungi un costruttore alla classe Ascoltatore che accetta un JFrame e ti salvi tale referenza all'interno di un campo di classe
    codice:
    private JFrame myFrame;
    
    public Ascoltatore(JFrame myFrame)
    {
    	this.myFrame = myFrame;
    }
    Dopo di che al momento della creazione di Ascoltatore passi il tuo JFrame
    codice:
    Ascoltatore a = new Ascoltatore(this);

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.