View Full Version : [JAVA] Eventi finestre
fbcyborg
20-07-2005, 10:21
Ciao Ragazzi,
ho bisogno di un consiglio sulle GUI che non so proprio come risolvere un problema.
Ho un Frame principale della mia applicazione.. Esso ha dei pannelli con dei bottoni. Ho collegato ad un bottone un evento secondo cui deve aprire un nuovo JFrame che consiste in un form di insermento.
Il problema è che la finestra principale (sottostante) rimane attiva, dandomi quindi la possibilità di di premere di nuovo quel bottone ed aprire un nuovo JFrame associato. Volendo evitare questo, avrei intenzione di disabilitare il form principale, in modo da non poter più aprire form secondari. Il problema è che non so come riabilitare il form principale alla chiusura della maschera appena aperta.
Grazie per i consigli
Alvaro Vitali
20-07-2005, 10:56
Fai implementare alla classe del frame principale l'intefaccia windowlsitener (o estendi la classe windowadapter), registri tale classe come ascoltatore degli eventi di finestra del frame secodario e nel metodo windowClosing che dovrai implementare (nella classe del frame principale) fai in modo che il frame si "riabiliti".
Più comodo secondo me è invece che aprire e chiudere il jframe secondario , renderlo "visibile" (setVisible(true)) alla pressione del bottone sul frame principale così ad una successiva pressione del bottone non si aprirà una nuova finestra ma verrà invocato di nuovo il setVisisble(true) , poi col bottone del frame secondario prendi i dati del form e rendi invisibile il frame.
ciao
non so come risolvere il tuo problema, forse basta catturare l'evento onWindowClosing (o un nome simile) del secondo JFrame.
Cmq quando ho un bottone in un JFrame principale che deve aprire un altro JFrame secondario di solito io creo il frame secondario nel costruttore del frame principale senza poi mostrarlo a video.
Poi all'evento del click del bottone eseguo il metodo show del JFrame secondario, così anche se il bottone viene premuto 1000 volte di JFrame secondari se ne vede 1 solo.
azz, Alvaro Vitali mi ha anticipato di poki secondi!
Ed è stato pure più esauriente, devo migliorarmi x il futuro
fbcyborg
20-07-2005, 11:10
Grazie Alvaroo!!!
provo subito! ti faccio sapere!!
grazie ragazzi...
fbcyborg
20-07-2005, 11:46
Dunque, ho fatto come hai detto tu Alvaro.. optando per la seconda scelta. E' molto più comodo caricare tutti i vari frames all'avvio del programma principale e renderli visibili a tempo opportuno.
Ora dovrei chiudere il frame in questione collegando l'evento di chiusura ad un bottone. Come devo fare?
Allo stesso modo per chiudere i frame basta solo che li rendi non visibili, quindi basta usare il metodo hide() (oppure setVisible(false)) invece di show() (o setVisible(true))
fbcyborg
20-07-2005, 11:55
OK grazie, tanto a questo punto, visto che creo i nuovi oggetti Jframe nella classe principale, posso controllarli da lì...
fbcyborg
20-07-2005, 12:17
Allo stesso modo per chiudere i frame basta solo che li rendi non visibili, quindi basta usare il metodo hide() (oppure setVisible(false)) invece di show() (o setVisible(true))
Il problema è che non posso fare this.setVisible(false) .
riepilogando: la mia GUI principale, crea un frame, lo visualizza su pressione di un tasto. Questo frame ha un tasto "Annulla". Tale tasto quando premuto deve rendere nascosto il frame. Non so come fare purtroppo... Questo perchè non trovo un metodo che lo faccia.
Ditemi se devo estendere ulteriori classi oltre a JFrame.
Quando crei l'event listener per il bottone annulla non usare il costruttore di default ma fanne uno che prenda come parametro il tuo frame, una cosa simile
nel JFrame
AnnullaListener a=new AnnullaListener (this);
annullaButton.addActionListener(a); //dove annullaButton è il nome del bottone "Annulla"
...
fouri dal JFrame
class AnnullaListener implements ActionListener{
frameSecondario fs; //dove frameSecondario è il nome della classe che rappresenta il tuo frame
AnnullaListener (frameSecondario f){
fs=f
}
metodo chiamato quando premi il tasto annulla di cui non ricordo il nome ()
{
fs.hide();
}
}
Spero di essermi spiegato in maniera decente, altrimenti richiedi pure spiegazioni
Alvaro Vitali
20-07-2005, 12:29
Ma scusa quando crei il JButton Annulla imposterai una scoltatore per l'evento di pressione:
JButton annulla = JBUtton("annulla");
annulla.addActionListener(oggetto-che-ascolta);
l' oggetto-che-ascolta implementerà ActionListener ed avrà un metodo ActionPerfomed(ActionEvent e) in cui puoi chiamare il setVisible(false) se l'oggetto che ha invocato l'evento è annulla.
oggetto-che-ascolta potrebbe essere il tuo frame principale...oppure lo stesso frame secondario, in tal caso annulla.addActionListener(oggetto-che-ascolta); diventerà annulla.addActionListener(this); ed il frame secondario dovrà implementare ActionListener ed il metodo ActionPerformed come sopra... :)
Secondo caso:
class frameSecondario extends JFrame implements ActionListener {
private JButton annulla = JBUtton("annulla");
public frameSecondario() {
super();
// bla bla bla
annulla.addActionListener(this);
// aggiungi il bottone al layout
}
public void ActionPerfomed(ActionEvent e) {
Object source = e.getSource();
if (source==annulla) this.setVisible(false);
}
}
Mi sto incastrando con le risposte di Molz ma credo che stiamo dicendo le stesse cose... :D
Mi sto incastrando con le risposte di Molz ma credo che stiamo dicendo le stesse cose... :D
Infatti :D
fbcyborg
20-07-2005, 12:35
Scusami.. purtroppo ci vuole un po' di pazienza con queste cose.. resta difficile anche a me spiegare bene il problema.. Intanto ti dico che sto usando Eclipse per realizzare la gui. Non so se hai in mente com'è lo stile di programmazione di Eclipse, ma posso dirti che ci sono tanti metodi getNomeComponente()
per inizializzializzarli;
per esempio getAnnullaButton(){
... creazione oggetto
... impostazioni varie
annullaButton.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event ActionEvent e) {
this.hide(); // o qualcosa del genere, intendendo this come il frame
}
});
}
devo quindi inserire cosa voglio che faccia la mia finestra dentro quel pezzo di codice ActionPerformed...
Non posso nemmeno mettermi a cambiare troppo la struttura del mio programma perchè ho la consegna di un progetto molto presto e mi devo pure sbrigare.. porca miseria!!!
Grazie amico... grazie x la disponibilità
fbcyborg
20-07-2005, 12:38
ah, ecco, nel frattempo che scrivevo stavate rispondendo...
ho letto quello che dice Alvaro Vitali...
dunque, se dovessi fare come ha detto lui, come lo adatto a quello stralcio di codice che ho postato?
Alvaro Vitali
20-07-2005, 12:39
Anche io uso eclipse ma la Gui cmq la faccio a mano proprio perchè non mi piace come organizza le cose, cerca di replicare questo che ti scrivo, in questo modo deleghi al frame secondario il compito di ascoltare la pressione del tasto e rendersi invisibile (mi pare che solo questo non riuscivi a fare):
class frameSecondario extends JFrame implements ActionListener {
private JButton annulla = JBUtton("annulla");
public frameSecondario() {
super();
// bla bla bla
annulla.addActionListener(this);
// aggiungi il bottone al layout
}
public void ActionPerfomed(ActionEvent e) {
Object source = e.getSource();
if (source==annulla) this.setVisible(false);
}
}
Come ti ho detto io farei così
per esempio getAnnullaButton(){
... creazione oggetto
... impostazioni varie
annullaButton.addActionListener(new MioListener(this));
}
.....
} //chiusura della parentesi graffa della classe principale (il tuo JFrame)
class MioListener implements java.awt.event.ActionListener() {
nomeDelleClasseCheRappresentaIlJFrame a;
MioListener (nomeDelleClasseCheRappresentaIlJFrame a2){
a=a2;
}
public void actionPerformed(java.awt.event ActionEvent e) {
a.hide(); }
}
Stranamente Alvaro mi ha anticipato, i nostri metodi sono diversi, ma vanno beneone entrambi.
fbcyborg
20-07-2005, 13:16
OK grazie!!! finalmente sono riuscito a fare questa cosa.. anche se con fatica ma l'importante è che ora ci sia riuscito.
Adesso però, oltre a questo bottone c'è anche un bottone OK, che dopo aver fatto determinate operazioni definite in un actionPerformed, anch'esso deve nascondere il frame...
Il codice di uno dei bottoni annulla che ho scritto è:
// Bottone Annulla (OK - va bene)
private JButton getCancelButtonAdd() {
if (cancelButtonAdd == null) {
cancelButtonAdd = new JButton();
cancelButtonAdd.setBounds(338, 147, 94, 25);
cancelButtonAdd.setText("Annulla");
cancelButtonAdd.addActionListener(new CloseListener(this));
}
return cancelButtonAdd;
}
//*************************************
// Classe ulteriore per chiudere il frame... OK - Va bene...
class CloseListener implements java.awt.event.ActionListener{
FrmInserisci f;
public CloseListener(FrmInserisci frm){
f = frm;
}
public void actionPerformed(java.awt.event.ActionEvent e){
f.hide();
}
}
//*************************************
//Metodo di un bottone OK:
private JButton getOkButtonAdd() {
if (okButtonAdd == null) {
okButtonAdd = new JButton();
okButtonAdd.setBounds(243, 146, 87, 26);
okButtonAdd.setText("OK");
okButtonAdd.addActionListener(new java.awt.event.ActionListener() {
public void actionPerformed(java.awt.event.ActionEvent e) {
// deve effettuare delle operazioni e poi chiudere!!!! come il tasto annulla
}
});
}
return okButtonAdd;
}
Questo è quanto... grazie ancora!
basta che associ al bottone OK lo stesso listener che al bottone Annulla
okButtonAdd.addActionListener(new CloseLintener(this))
e poi come diceva alvaro vitali è sufficiente che nella funzione actionPerformed(ActionEvent e) tu invochi il metodo getSource sull'evento
Object source = e.getSource();
e poi esegui il controllo
if(source==okButtonAdd ){
esegui le tue operazioni
}
//e poi in ogni caso
f.hide();
Altrimenti puoi creare un listener diverso per ogni bottone che crei e in tal caso sarebbe
okButtonAdd.addActionListener(new OKCloseLintener(this))
e poi la stessa procedura di prima per il bottone Annulla
fbcyborg
20-07-2005, 13:46
OK! c'è solo un piccoliiiiiiissimo problema:
if(source==okButtonAdd ) non posso farlo perchè non mi vede quella variabile....
anche se ritengo sia una cosa assurda
Alvaro Vitali
20-07-2005, 14:04
Che visibilità ha quel bottone?
In alternativa puoi impostare
okButtonAdd.setActionCommand("ok");
e poi sostituire
String command = e.getActionCommand();
if (command.equals("ok")) {
}
al posto di if(source==okButtonAdd )
fbcyborg
20-07-2005, 14:19
Il Bottone è una variabile privata.
ma anche mettendolo pubblico non funziona
Bè, devi fare
if(source==f.okButtonAdd )
me ne ero dimenticato :doh:
è ovvio che non ti veda la variabile okButtonAdd perché sei nel listener del comando, che per come abbiamo messo giù il codice è una classe diversa dal frame
fbcyborg
20-07-2005, 14:28
OK! funzionaaa!!! TnX TnX TnX!!!!
fbcyborg
20-09-2005, 19:48
Ho dovuto cambiare di nuovo l'ottica dell'applicazione...
Non potevo semplicemente nascondere all'utente il frame creato...
In pratica ho risolto dichiarando nella classe del mio JFrame una variabile
private JFrame currentFrame = this;
dopo di che in un bottone ci ho messo un evento action listener standard... e ho fatto puntare a null il current frame, l'ho nascosto e chiamato il garbage collector...
Dovevo per forza creare un nuovo JFrame per causa di forza maggiore...
Mmh... anche a me piace usare l'implementazione anonima dei listener e come voi spesso ho la necessità di usare this all'interno.
Il this interno però non è la JFrame, bensì l'implemenstazione anonima del listener: io risolvo con un metodo privato della classe contenente l'implementazione anonima che chiamo outerThis() :D
In questo modo chiamo i metodi della classe principale e non quelli del listener...
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.