In un JFrame ho inserito un JDesktopPane e un JMenu.
nel JDesktopPane mostro un internal frame.
vorrei capire come faccio ad un evento del menuitem ricavare i valori inseriti nell'internalframe
In un JFrame ho inserito un JDesktopPane e un JMenu.
nel JDesktopPane mostro un internal frame.
vorrei capire come faccio ad un evento del menuitem ricavare i valori inseriti nell'internalframe
Beh, intanto puoi avere più JInternalFrame, giusto?
Se così, allora innanzitutto dovresti sapere tu se le voci del menù hanno senso per ciascun internal frame e in tal caso, forse, avrebbe più senso mettere il menu nel JInternalFrame.
Se non vuoi/puoi mettere il menù in ognuno dei JInternalFrame, allora devi scegliere su quale JInternalFrame operare e la cosa tipica è "quello selezionato". JDesktopPane ha il metodo getSelectedFrame().
Il tuo internal frame sarà presumibilmente (e sarebbe preferibile) una tua classe che estende JInternalFrame. A quel punto fai il cast e puoi invocare metodi per ottenere dati, metodi che devi ovviamente implementare ed "esporre" in modo oculato in base a cosa rappresenta il contenuto del internal frame.
Fin qui ci sono arrivatoSe non vuoi/puoi mettere il menù in ognuno dei JInternalFrame, allora devi scegliere su quale JInternalFrame operare e la cosa tipica è "quello selezionato". JDesktopPane ha il metodo getSelectedFrame().
si la mia classe estente JInternaFrameIl tuo internal frame sarà presumibilmente (e sarebbe preferibile) una tua classe che estende JInternalFrame.
da qui in poi tutto buio….A quel punto fai il cast e puoi invocare metodi per ottenere dati, metodi che devi ovviamente implementare ed "esporre" in modo oculato in base a cosa rappresenta il contenuto del internal frame.
Ok, allora faccio un esempio (poi adatta tu in base alle tue esigenze): immagina che nel tuo internal frame stai gestendo/editando i dati di una persona (nome, cognome, indirizzo, città, ecc...) con una serie di campi.
Ci sono tecnicamente svariate possibilità per estrarre i dati dalla tua classe:
1) Esporre metodi che permettono di ottenere i riferimenti direttamente ai componenti, es.
public JTextField getTextFieldNome()
public JTextField getTextFieldCognome()
....
2) Esporre metodi che permettono di ottenere i dati, es.
public String getNome()
public String getCognome()
....
3) Esporre i dati come entità unica tramite un apposito "bean" e un singolo getter, es.
public Persona getPersona()
Delle 3 opzioni, la 1) è la peggiore. Per un motivo molto semplice: vai a "esporre" troppe informazioni, cioè il fatto di far sapere all'esterno che ci sono dei campi e sono di quel tipo ben preciso. E che oltretutto sarebbero manipolabili dall'esterno. Inoltre se cambia l'interfaccia grafica del tuo internal frame (es. un campo che prima era JTextField ora è JTextArea) .... impatta anche sul resto del codice.
Le opzioni 2) e 3) sono migliori e man mano ad un livello di astrazione maggiore.
Non sono le uniche soluzioni possibili ma sono ragionevolmente le minime che si possono fare. Se hai capito il concetto, non dovresti avere particolari problemi a individuare lo scenario che più si adatta al tuo caso.
ok, intanto grazie per la pazienza….
vorrei adottare lo scenario 2, ossia esporre i metodi con i dati che mi servono…
nella mia classe JInternalFrame ho creato
però non capisco come faccio a vederla dall'action performed del mio menù….che è nel JFrame che contiene tutto...codice:public String getIsin(){ String Isin = jFxIsin.getText(); return Isin; }
Se hai il riferimento al JDesktopPane (dovresti averlo o perlomeno fare in modo che sia così), usi getSelectedFrame(). Che ti fornisce come tipo "statico" un JInternalFrame. Ma tu sai che i tuoi internal frame sono della tua classe specifica che estende JInternalFrame. Quindi fai un "downcast" (che non darà problemi per via dell'assuzione appena detta) e quindi puoi invocare quei metodi che espongono i dati.
beh non è che ci capisco molto….
da qui non ho capito come fare il downcast etch mi puoi fare un esempio….codice:private void salvaMenuItemActionPerformed(java.awt.event.ActionEvent evt) { JInternalFrame nome; nome = deskTop.getSelectedFrame();
Ovviamente MioInternalFrame è il nome della *tua* classe.codice:MioInternalFrame frame = (MioInternalFrame) deskTop.getSelectedFrame(); if (frame != null) { String isin = frame.getIsin(); ......
getSelectedFrame può restituire null, se non c'è un frame selezionato, quindi va testato.
ok, ho capito il meccanismo.
c'è un problema come hai detto all'inizio di questa discussione, posso avere più JInternalFrame. Nel mio caso faccio in modo di visualizzarne uno per volta.
Utilizzando deskTop.getSelectFrame() - ottengo il frame "visualizzato", però in base al frame visualizzato devo variare il metodo salva.
Ho un metodo rozzo che mi scrive in una label una variabile e in base alla varibile so che frame ho aperto e quindi mi regolo di conseguenza, ma ci sarebbe un sistema per poter gestire meglio la cosa?
Cosa c'è di "differente"? Quello che è importante in questi casi è sapere/stabilire cosa non cambia e cosa cambia perché è specifico.
La classe del internal frame è solo una? L'aspetto grafico non cambia? Se fosse così, cosa cambia? Cambia il comportamento nei confronti dei dati? E se sì, in che modo?