Newsgroup: it.comp.java
Titolo: Chiudere JFrame chiamante da JFrame chiamato

Sono alle prime armi con java, e nel voler "arricchire" un programma di 
esempio preso dal libro che sto' studiando mi sono imbattutto in un 
problema.
Il primo JFrame visualizza tra le altre cose 2 bottoni:
il bottone OK che per il momento non è implementato in alcun modo, e il 
bottone ESCI che visualizza un altro JFrame che chiede la conferma per 
uscire.
Anche il JFrame di conferma ha 2 bottoni, SI e NO.
Il problema è sul bottone SI, infatti cliccando dovrebbe chiudere oltre al 
JFrame su cui il bottone è stato disegnato, anche il JFrame principale..... 
non riesco a capire come si possa fare.
Potete darmi una mano?
Vi copio e incollo il sorgente:
________________________________________
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class InputFormattati {
public static void main(String[] args)
{
CreaFrame frame = new CreaFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.show();
}
}
class CreaFrame extends JFrame {
public CreaFrame()
{
setTitle("Test Input FOrmattato");
//setSize(400, 400);
Container contentPane = getContentPane();
CreaPannello pannello2 = new CreaPannello();
contentPane.add(pannello2);
pack();
}
}
class CreaPannello extends JPanel {
public CreaPannello()
{
setLayout(new BorderLayout());
JPanel pannello = new JPanel();
// aggiungo componenti ai contenitori
JLabel label = new JLabel("Password:");
pannello.add(label);
JPasswordField password = new JPasswordField( null , 10);
pannello.add(password);
add(pannello, BorderLayout.CENTER);
//creo pannello da aggiungere sotto
JPanel pannelloSouth = new JPanel();
ActionListener listener = new Azione();
JButton bottoneOk = new JButton("OK");
bottoneOk.addActionListener(listener);
pannelloSouth.add(bottoneOk, BorderLayout.SOUTH);
JButton bottoneEsci = new JButton("ESCI");
bottoneEsci.addActionListener(listener);
pannelloSouth.add(bottoneEsci, BorderLayout.SOUTH);
add(pannelloSouth, BorderLayout.SOUTH);
}
private class Azione implements ActionListener
{
public void actionPerformed(ActionEvent evento)
{
if ("OK".equals(evento.getActionCommand()))
{
} else if ("ESCI".equals(evento.getActionCommand()))
{
JFrame messaggio = new JFrame("Attenzione");
messaggio.setLayout(new FlowLayout());
messaggio.add(new CreaBottone("SI", messaggio));
messaggio.add(new CreaBottone("NO", messaggio));
messaggio.pack();
messaggio.setResizable(false);
messaggio.show();
}
}
}
}
class CreaBottone extends JButton {
public CreaBottone(String aName, final JFrame o)
{
JButton bottone = new JButton(aName);
add(bottone);
bottone.addActionListener(new
ActionListener(){
public void actionPerformed(ActionEvent ev)
{
if ("SI".equals(ev.getActionCommand()))
{
// come esco completamente??!!
} else {
o.dispose();
}
}
});
}
}
_____________________________
grazie in anticipo degli eventuali suggerimenti.
Ciao 

Per rispondere sinteticamente alla tua domanda, ti consiglio di usare 
dei Dialogs piuttosto che un JFrame ad hoc per gestire un evento come 
quello che hai descritto... mi sembra un aperdita di tempo inutile.
http://java.sun.com/docs/books/tutorial/uiswing/components/dialog.html
E poi mi sento in dovere di dirti che quel codice che hai postato... e' 
totalmente da rivedere! Ok, del resto hai scritto di essere alle prime 
armi... ma occhio a strafalcioni OO come la classe CreaBottone... 
inguardabile!
Scusa ma ora non ho tempo per scrivere piu' righe di queste, magari a 
domani.
Bye
Corrado
BauX ha scritto:


 ha scritto nel messaggio 
news:QqJGg.26793$ZJ6....@tornado.fastwebnet.it...


 Ciao e grazie
Mhh vediamo... avevo capito che avevi esperienze di linguaggio 
procedurale da questo costruttore!
public CreaBottone(String aName, final JFrame o) {
    JButton bottone = new JButton(aName);
    add(bottone);
...ecc...
Immagino che quel parametro JFrame o tu lo intendi come "il frame dentro 
cui voglio ficcare questo bottone". Molto C-esco. Non hai bisogno di 
passare la referenza del frame al bottone, il bottone non ha alcun 
bisogno di sapere dove verra' visualizzato (in generale, ma visto che 
qui girano un sacco di pignoli diro' "in questo caso! :) )
Oltre a scrivere codice poco riutilizzabile, lo rendi anche poco 
leggibile e prevedibile. Secodariamente, non vedo perche' usare una 
classe per "creare un bottone" quando le cose che fai in quel 
costruttore lo puoi fare benissimo nel blocco codice che deve creare 
quel bottone... e del resto gia' lo fai qui:
JButton bottoneOk = new JButton("OK");
bottoneOk.addActionListener(listener);
pannelloSouth.add(bottoneOk, BorderLayout.SOUTH);
//(Siamo in CreaPannello)
[cmq per la cronaca penso che tu volessi dire o.add(bottone) nel pezzo 
di codice di prima, facendo come hai fatto aggiungi un bottone ad un 
bottone...]
Altra cosa che dovresti rivedere, ma con comodo dato che non e' 
necessario, e' il modo in cui costruisci il frame tramite la 
CreaPannello. Usa un LayoutManager piu' potente, facendo come hai fatto 
crei un pannello vuoto, poi due pannelli, uno sopra e uno sotto, poi gli 
elementi... un gran casino e rende l'app piu' pesante... Guarda il 
tutorial della Sun sui Layout. Ti consiglio di partire subito col 
GridBagLayout, che ti avverto e' un GRAN CASINO (per chi comincia) ma e' 
l'unico layout che ti permette di fare TUTTO! E sfido chiunque ad 
affermare il contrario! :)
Per i Dialog, ricorda che possono ritornare un valore a seconda del 
bottone Ok - Annulla premuto. Da li decidi se far chiudere il frame o meno.
Se hai altri dubbi chiedi.