Newsgroup: it.comp.java
Titolo: visibilita'

Ho qualche problema con la visibilita' delle variabili
nello specifico
ho una classe A (che e' un interfaccia grafica, estensione di JFrame)
che fa un tot di cose.
Questa classe posside il metodo main che la istanzia
e fa partire l'applicazione
  public static void main(String[] args)
              {
              A app=new A();
              }
La suddetta ha un metodo M pubblico che opera sulla classe
all'interno dell'interfaccia ho un JButton B
che apre una nuova finestra (classe K estensione di JFrame)
che funziona sostanzialmente come menu di selezione
per determinate operazioni.
Per effettuarle ho pero' bisogno di chiamare metodi sull'istanza
app di A, cosa che risulta impossibile (errore di visibilita' a 
compile-time)
qualche suggerimento?


1. Utilizzare dei menu gia' fatti (JMenu, JPopUpMenu, ..).
2. Rendere A listener degli oggetti di K, passando un suo riferimento al
costruttore di K stesso.

gnurant ha scritto:

controllero' le classi predefinite, ma cosi' a memoria non mi
pare facciano al caso mio.
per quanto riguarda la 2 ci ho gia' provato, ma la variabile app
non risulta accessibile nemmeno dal listener del pulsante che lancia
K.

 K.
A implements Listener
    actionPerformed()
        if (B) new K(this)
        if (C) ciao!
class K
    K(Listener l)
    Button C
        C.addListener(l)

gnurant ha scritto:

Non ho capito.
Il mio codice e' cosi:
all'interno di A c'e' il seguente bottone
bottone = new JButton();
bottone.addActionListener(new ActionListener()
	{public void actionPerformed (ActionEvent e)
		{
		K k = new k();	***
		k.setVisible(true);
		}});
*** da qui app non e' accessibile, quindi posso scrivere K k = new k(app);

 *** da qui app non e' accessibile, quindi posso scrivere K k = new k(app);
Non ho capito a mia volta. Prova cosi':
- A implements ActionListener  // listener sia per A che per K
- K k = new K(this);  // this si riferisce alla tua istanza di A vista come
un ActionListener
- per i componenti di K imposti il listener passato nel costruttore
- nell'actionPerformed() di A gestisci gli eventi di A e di K (puoi
differenziarli con setActionCommand() che recuperi poi dall'event)

gnurant ha scritto:

A parte che non mi e' chiarissimo,
avrei voluto minimizzare cambiamenti di struttura nel mio codice (che e'
parecchio lungo e piuttosto complesso)
ora ti scrivo un codice minimale che ti renda chiara la struttura del
mio codice:
class Principale extends JFrame
	{
	void metodo() {};
	public Principale()
		{
		JPanel p = new JPanel;
		setContentPane(p);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton b = new JButton("bottone");
		b.addActionListener(new ActionListener()
			{public void actionPerformed (ActionEvent e)
				{
				Cliente c = new Cliente(); //chiamata
				c.setVisible(true);
				}});
		p.add(b);
		pack();
		setVisible(true);
		}
	public static void main(String[] args)
		{
		Principale app=new Principale();
		}
	}
class Cliente extends JFrame
	{
	JPanel p;
	JButton b;
	public Cliente()
		{
		p=new JPanel();
		b=new JButton("click");
		setContentPane(p);
		p.add(b);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		b.addActionListener(new ActionListener()
			{
			public void actionPerformed (ActionEvent e)
				{
				metodo(); //metodo della principale
				hide();
				}});
		}
	}
non ho provato a compilarlo ma dovrebbe andare commentando la riga
dove chiamo il metodo
proprio li sta il punto.... come diavolo lo chiamo?


Mi intrometto a meta' discorso :)
class Cliente extends JFrame {
   JPanel p;
   JButton b;
   protected Principale prin;
     public Cliente(Principale principale) {
     prin = principale;
     p = new JPanel();
     b = new JButton("click");
     [...]
         public void actionPerformed (ActionEvent e) {
           prin.metodo(); // o forse anche Cliente.this.prin.metodo();
           hide();
         }

         }
guarda che e' proprio li il problema.
chiamare prin da un errore a compile time
di "cannot resolve symbol"; la variabile in questione
non e' visibile

 non e' visibile
Hai ragione, errore mio, lunedi mattina ed ero di fretta :)
Deve essere dichiarata "final" come parametro del metodo
class Cliente extends JFrame {
   JPanel p;
   JButton b;
   protected Principale prin;
     public Cliente(final Principale principale) {
     prin = principale;
     p = new JPanel();
     b = new JButton("click");
     [...]
         public void actionPerformed (ActionEvent e) {
           principale.metodo();
           hide();
         }
Ah, con Eclipse bastava un CTRL+1 e avresti avuto il suggerimento per 
correggere l'errore ;) !


Ma allora perche' l'assegnamento? Bastava chiamare prin.metodo().
E poi bisogna dichiarare final anche l'oggetto Principale quando istanzi il
nuovo Cliente.
Ma complicarsi meno la vita senza classi anonime?


E' decisamente meglio che Principale sia Listener di b.
Ah, guarda che hide() e' deprecato.

 nuovo Cliente.
Ovviamente perche' ho sbagliato: Nel codice e' rimasta una riga di 
troppo (Quella appunto dell'assegnamento) :)
Colpa del cambiamento d'ora, oggi sono proprio fuori fase :(