Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2010
    Messaggi
    278

    verificare se una finestra è gia' aperta

    Ciao a tutti,ho un menu in una finestra principale che al clic sulla voce mi si apre un'altra finestra.
    Vedo che se clicco piu' volte sulla stessa voce mi si aprono chiaramente piu' finestre.
    Vorrei impostare una condizione se la finestra è aperta non ne apro altre,altrimenti procedo con l'apertura.

    Grazie

  2. #2
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Utilizza una classe con il costruttore privato ed un campo statico: il campo sarà una variabile booleana statica che ti dirà se la finestra è aperta o chiusa.

  3. #3
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Altra soluzione: quando apri la nuova finestra, terrai un riferimento a questa... spero.
    Se così è, allora dovrai richiamare la new sono nel caso in cui la variabile sia nulla. In caso contrario, non effettuare la creazione della finestra.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  4. #4
    Utente di HTML.it
    Registrato dal
    Dec 2009
    Messaggi
    1,123
    Originariamente inviato da LeleFT
    Altra soluzione: quando apri la nuova finestra, terrai un riferimento a questa... spero.
    Se così è, allora dovrai richiamare la new sono nel caso in cui la variabile sia nulla. In caso contrario, non effettuare la creazione della finestra.


    Ciao.
    Ciò che ho pensato prima!
    Ma ho una domanda: quando la finestra viene chiusa, si è certi che la variabile (istanza della finestra) ora è null? Perchè in caso contrario non si aprirebbe più nemmeno se la finestra fosse chiusa...

  5. #5
    Utente di HTML.it
    Registrato dal
    Nov 2009
    Messaggi
    755
    Originariamente inviato da Patrick Jane
    Ciò che ho pensato prima!
    Ma ho una domanda: quando la finestra viene chiusa, si è certi che la variabile (istanza della finestra) ora è null? Perchè in caso contrario non si aprirebbe più nemmeno se la finestra fosse chiusa...
    Ho appena testato la cosa e ovviamente le cose variano un po' a seconda del "default close operation" che si da al frame..
    -se il frame ha "EXIT_ON_CLOSE" banalmente termina il programma quindi non si pone il problema visto anche che penso non sia l'effetto desiderato

    -con "DO_NOTHING_ON_CLOSE" addirittura non si riesce a chiudere la finestra ,altro caso che non credo interessi poi tanto

    -con "HIDE_ON_CLOSE" la finestra alla chiusura viene solo nascosta ma il riferimento nella variabile c'è ancora , e quindi volendo fare ancora click alla "voce" che diceva l'autore del post controllando col null non verrebbe aperta la nuova frame

    -con "DISPOSE_ON_CLOSE" io ricordavo che la frame venisse chiusa e venissero liberate le rispettive risorse , ma a quanto pare il riferimento nella variabile si mantiene , quindi anche in questo caso la ricreazione della frame non avviene

    in conclusione il solo controllo al null non è sufficiente , andrebbero fatti ulteriori controlli (ad esempio se nascosta basterebbe invocare il setVisible(true) , il "do_nothing" nemmeno lo considero , il dispose vorrebbe un controllo a parte..)

    oppure si può intercettare l'evento della chiusura e settare a null la variabile della finestra (oltre che "disporre" la finestra)


  6. #6
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Pensavo più ad una gestione di questo tipo:

    codice:
    import java.awt.*;
    import javax.swing.*;
    import java.awt.event.*;
    
    public class FinestraPrincipale extends JFrame implements ActionListener {
       private JButton cmdApri;
       private JFrame secondoFrame;
    
       public FinestraPrincipale() {
          Container c = getContentPane();
          c.setLayout( null );
    
          cmdApri = new JButton("Apri finestra");
          cmdApri.setBounds(20, 20, 100, 35);
          cmdApri.addActionListener( this );
    
          c.add( cmdApri );
    
          setTitle( "Apertura singola finestra" );
          setSize(800, 600);
          setDefaultCloseOperation( EXIT_ON_CLOSE );
          setLocationRelativeTo( null );
          setVisible( true );
       }
    
       public void actionPerformed(ActionEvent ae) {
          if (secondoFrame == null) {
             secondoFrame = new JFrame();
             secondoFrame.setSize(300, 300);
             secondoFrame.setTitle( "Frame secondario" );
             secondoFrame.setDefaultCloseOperation( DISPOSE_ON_CLOSE );
             secondoFrame.setLocationRelativeTo( this );
          }
          secondoFrame.setExtendedState( Frame.NORMAL );
          secondoFrame.setVisible( true );
          secondoFrame.toFront();
       }
    
       public static void main(String[] args) {
          FinestraPrincipale fp = new FinestraPrincipale();
       }
    }
    Se la finestra non è stata creata, la creo, altrimenti la rivisualizzo (non mi preoccupo nemmeno se è visibile o meno) la riporto allo stato normale (non mi preoccupo se è ridotta ad icona o meno) e la porto in primo piano.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  7. #7
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Il problema però è che scritto solo così il codice (magari all'op va bene lo stesso, non lo ha specificato)
    la finestra viene creata solo la 1a volta (secondoFrame == null solo la prima volta).

    Quindi se dentro la finestra ci sono checkbox, textarea e quant'altro compilati quando
    riapri la finestra vengono rimostrati in quel modo, mentre uno si aspetterebbe uno stato iniziale.
    È quello che diceva giustamente zipangulu.

    Aggiungo per l'op, che, se fa al caso suo, potrebbe anche pensare di utilizzare una finestra modale.

  8. #8
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,317
    Originariamente inviato da c0der
    Il problema però è che scritto solo così il codice (magari all'op va bene lo stesso, non lo ha specificato)
    la finestra viene creata solo la 1a volta (secondoFrame == null solo la prima volta).

    Quindi se dentro la finestra ci sono checkbox, textarea e quant'altro compilati quando
    riapri la finestra vengono rimostrati in quel modo, mentre uno si aspetterebbe uno stato iniziale.
    È quello che diceva giustamente zipangulu.
    Sì è vero. Dipende molto da come l'utente intende gestire la cosa. Potrebbe anche essere sufficiente provvedere la classe di un metodo di "pulizia". Oppure, altra soluzione, si può provvedere alla rimozione dell'oggetto e alla sua ri-creazione:

    codice:
    if (secondoFrame != null) {
       secondoFrame.dispose();
    }
    secondoFrame = new SecondoFrame( ... );
    Tutto dipende da come l'utente ha deciso di gestire la cosa. Può decidere semplicemente di "nascondere" la finestra e farla riapparire così com'era. Può decidere di nasconderla e poi farla riapparire "pulita" o può decidere di ricrearla assicurandosi di avere prima distrutto quella precedente. Le soluzioni sono molte.

    Bisogna capire cosa si intende per "aperta" (creata e visibile? creata anche se non visibile?) e cosa vuole ottenere in base ai vari casi.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  9. #9
    Utente di HTML.it
    Registrato dal
    Sep 2012
    Messaggi
    707
    Le soluzioni sono molte certo.... volevo solo dire come diceva zipangulu che non era così immediato.

    Per esempio anche con la "secondoFrame.dispose();" (nel caso uno volesse la finestra nuova ogni volta)
    ci sarebbe ancora il problemino che se uno riclicca "Apri finestra" (senza prima chiudere secondoFrame)
    gli viene distrutta e ricreata quella già aperta.
    Risolvibilissimo certo, era solo per dire che non era proprio immediato.

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.