Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 14
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24

    [java] chiudere un jframe da un jpanel

    Salve a tutti ho creato un JFrame dove ho inserito un jPanel su questo jPanel ci sono dei jbutton volevo chiedere all'attivazione di uno di questi pulsanti si dovrebbe aprire un altro jframe (e fin qui tuttto bene) ma vorrei poter anche chiudere il primo jFrame..il metodo dipose() non funziona perché può essere usato dalla classe window e da le sue classi "figlie"...il metodo system.exit(0) nemmeno qualche idea su come posso fare

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da kekkuz87 Visualizza il messaggio
    vorrei poter anche chiudere il primo jFrame..il metodo dipose() non funziona perché può essere usato dalla classe window e da le sue classi "figlie"
    Questa è una classica questione di "design" delle classi. Il punto è solo fare in modo (e possibilmente nella maniera più "pulita" e object-oriented possibile) che sia possibile, direttamente o indirettamente, la invocazione del dispose() sulla istanza del frame.
    Questo può voler dire ad esempio fare in modo che il pannello abbia il riferimento al frame, oppure fare in modo che ci sia una "entità" (oggetto) che si occupa globalmente nella applicazione di fare da "gestore" delle finestre oppure ancora altri tipi di design.
    Insomma, dipende da come sono strutturate e relazionate le classi.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24
    Ok quindi se io il mio frame e il mio pannello lo creati cm due classi specifiche framehome e panelhome devo tipo riscrivere il metpdo dispose() nella classe panelhome....o se no cm faccio a dare un riferimento al framehome dal panelhome???

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24
    umh provo a scrivere meglio che prima ho risposto un po di fretta che dovevo scappare....
    In pratica io ho creato una classe chiamata FrameHome che estende JFrame....poi una classe PannelloHome che estende JPanel nella classe FrameHome aggiungo un istanza della classe PannelloHome...nella classe PannelloHome per gestire le azioni dei bottoni ho creato delle classi private....ma non riesco a capire come poter implementare il tuo suggerimento dare un riferimento al FrameHome nell PannelloHome

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Mi intrufolo un momento mentre attendi andbin.

    Il riferimento della Finestra al tuo Pannello lo puoi passare nel momento in cui istanzi Pannello. Due righe in una sorta di pseudo-Java:
    codice:
    class MyFrame extends JFrame {
      private MyPanel mpanel;
    
      MyFrame() {
        super("Titolo frame");
    
        mpanel = new JPanel(this);
        // ....
        // resto del codice...
      }
      
      // altro codice...
    }

  6. #6
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24
    intrufolati pure domattina provo a seguire il tuo suggerimento ora sono troppo stanco aggiorno domani grazie comunque

  7. #7
    .. e mi intrufolo anche io... anche perchè ho un problemino da proporvo proprio per la chiusura di un JFrame.
    Prima rispondo a kekkuz87:
    codice:
    bottoneEsci.addActionListener(new ActionListener()
                {
                    public void actionPerformed(ActionEvent e)
                    {
                        int  i = JOptionPane.showConfirmDialog(getFinestra(),"Confermando verrà annullato\n"
                            + "tutto il lavoro eseguito!","ATTENZIONE",JOptionPane.YES_NO_OPTION);
                        if(i==0)
                        {
                            getFinestra().dispose();
                        }
                        
                    }
                });
    dove naturalmente getFinestra() è un metodo che incapsula il JFrame che contiene il JPanel passato nel costruttore di JPanel:

    Costruttore JPanel
    codice:
    public GestioneListinoPannelloPrincipale(ListinoFrame f)
        {this.setFrameListino(f);}

    MA ADESSO VENIAMO AL MIO PROBLEMA... mettendo un bottone nel JPanel che gestisce la chiusura del JFrame non ho riscontrato problemi... il problema avviene quando si chiude la finestra dalla X in alto a destra .... ho implementato al JFrame l'interfaccia WindowListener e nel metodo windowClosing(WindowEvent evt) ho messo l'avvertimento come nel bottone(vedi sopra). Se si preme "SI" si chiude tutto e vabbè... ma se si preme "NO" vorrei che rimanesse su questa finestra e invece mi scompare anche se l'applicazione rimane in esecuzione... come devo fare????

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  8. #8
    vacca boia ... mi affogo sempre in un bicchiere d'acqua... vabbè posto l'esempio per altri:
    codice:
    addWindowListener(new WindowAdapter()
            {
                public void windowClosing(WindowEvent e)
                {
                    int  i = JOptionPane.showConfirmDialog(null,"Confermando verrà annullato\n"
                        + "tutto il lavoro eseguito!","ATTENZIONE",JOptionPane.YES_NO_OPTION);
                    if(i==0)
                    {
                        dispose();
                    }
                    if(i==1)
                    {
                        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
                    }
                }
            });

    il lupo perde il pelo ma non il vizio!
    http://www.pateam.eu
    http://pateam.altervista.org

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2013
    Messaggi
    24
    ok comincio a sentirmi stupido adesso vi posto un po di codice così magari riuscite a darmi l'input giusto per risolvere il problema
    codice:
    public class FrameHome extends JFrame {
        
        private String pathHomeUtente = System.getProperty("user.home");//ricavo la home dell'utente
         
        /**
         * costruttore che lancia il metodo per inizializzare l interfaccia
         */
        public FrameHome(){
            lancia();
        }
       
        private void lancia(){
           
           //...
           //codice per definire tutti i parametri del FrameHome...
           
            // creo pannello e lo aggiungo al frame
            pannello = new PannelloFrameHome();
            add(pannello);
             
            // garantisce che alla chiusura della finestra applicazione termini
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        }
        
        //...
        //altro codice per creare un JMenuBar per 
    }
    codice:
    public class PannelloFrameHome extends JPanel{
        
        private ButtonGroup gruppoPulsanti;
        private JButton scriviDB;
        private JButton scriviCD;
        
        
        private String pathHomeUtente = System.getProperty("user.home");//ricavo la home dell'utente
        
        /**
         * costruttore della classe
         */
        
        public PannelloFrameHome(JFrame frame){
            
            
            //creo gruppo pulsanti
            gruppoPulsanti = new ButtonGroup();
            
             
            //creo pulsante Scrivi CD
            scriviCD = new JButton("Inseirisci CD");
            scriviCD.setToolTipText("Per inserire o eliminare un CD");
            gruppoPulsanti.add(scriviCD);
            this.add(scriviCD);
            PannelloFrameHome.ScriviCD scritturaCD = new PannelloFrameHome.ScriviCD();
            scriviCD.addActionListener(scritturaCD);
    
            //...
            //altro codice per la gestione di altri pulsanti
            //e la definizione del layout del pannello
            
    }
        
        //definisco una serie di classi private atte a gestire azioni utente su ogni pulsante
      
        /**
         * Classe interna per gestire l'azione del pulsante ScriviCD
         */
        private class ScriviCD implements ActionListener{
            @Override
            public void actionPerformed(ActionEvent evento){
                dispose();//****ovviamente questo è sbagliato!!***
                FrameInserisci fr = new FrameInserisci();
                PanelCD cd = new PanelCD();
                fr.add(cd);
                fr.setVisible(true);   
            }
             
          
        //...
        //serie di altre classi interne per la gestione delle azioni dei pulsanti
           
    }
    Ultima modifica di kekkuz87; 03-01-2014 a 11:31

  10. #10
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Il tuo codice non compila nemmeno suppongo.
    All'interno di FrameHome, dove fai:
    codice:
            // creo pannello e lo aggiungo al frame
            pannello = new PannelloFrameHome();
            add(pannello);
    modifica in:
    codice:
            // creo pannello e lo aggiungo al frame
            pannello = new PannelloFrameHome(this);
            add(pannello);

    All'interno di PannelloFrameHome, crea una variabile nei campi di istanza (dove hai i JButton) e chiamala tipo:
    codice:
    private FrameHome frameHome;
    Ora nel costruttore di questo tuo pannello, visto che hai già il parametro fai solo:
    codice:
    public PannelloFrameHome(FrameHome frameHome) {
      this.frameHome = frameHome;
    dove invochi dispose, fai:
    codice:
    frameHome.dispose();
    Attento comunque a ciò che fai, perchè il dispose provoca la chiusura del frame, e se è quello che mantiene l'applicazione... l'applicazione termina! Se intendi nasconderlo soltanto devi usare setVisible(false). Ad ogni modo poni quel dispose come ultima istruzione.

    Non ho fatto prove, ma ad occhio dovrebbe andare... se ci sono problemi chiedi.

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.