Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    [Java] Gestire JDialog e JFrame - consiglio

    Ho bisogno di un consiglio/aiuto......

    con un pulsante avvio una Classe() che crea una JDialog con altri component...
    poiché l'apertura, o meglio, la visualizzazione del JDialog richiede un tempo
    variabile, ho pensato di creare un JFrame con un'icona .gif animata tipo
    barra di loading; come viene cliccato sul pulsante, creo prima il JFrame,
    che è setAlwaysOnTop(true);, e dopo creo il JDialog. Soltanto non riesco a gestire
    in modo corretto la visualizzazione dei due componenti.

    Vorrei un consiglio su come gestire i due componenti in modo corretto,
    cioè appeno clicco sul pulsante viene creato e visualizzato il JFrame e
    solo dopo che è stato processato tutto il codice del JDialog visualizzarlo
    e chiudere il JFrame.

    Non so se è opportuno usare i Thread e in che modo!!

    Grazie a Tutti

  2. #2
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, puoi vedere se lo spashscreen può tornarti utile
    http://docs.oracle.com/javase/tutori...ashscreen.html

  3. #3
    Grazie mille,
    ho dato un'occhiata, non sono però riuscito a farlo funzionare.
    Posto il codice.....

    L'actione del JButton....
    codice:
    private class ActionBtn implements ActionListener {
    	public void actionPerformed (ActionEvent e) {
                    Prova p = new Prova(5000);
    		p.splashWaitAndStop();
    		
                    // dopo crea il JDialog....				
    		new FrameC(false);
            }
    }
    La Classe Prova() con cui ho provato....
    codice:
    public class Prova extends JFrame {
    
    	/**
    	 * 
    	 */
    	private static final long serialVersionUID = 1L;
    	
    	private int duration;
    	private JLabel banner;
    	private Color colore;
    	private JPanel container;
    	
    	public Prova(int duration) {
    		this.duration = duration;
    		
    		// creo lo splash screen usando un JFrame
    		banner = new JLabel("ATTENDERE");
    		colore = Coockies.verdeBar;
    		banner.setForeground(colore);
    		
    		JLabel icoLoad = new JLabel(new ImageIcon("images\\ico\\loading6.gif"));
    		
    		container();
    		container.add(banner);
    		container.add(icoLoad);		
    		home();
    		
    	} // FCOS
    	
    	public void splashWaitAndStop() {
    		// visualizza lo splash
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() { setVisible(true); }
    		});
    		
    		// attendi per tot ms
    		try { Thread.sleep(duration); }
    		catch(InterruptedException e) { System.err.println(e);}		
    		
    		// nascondi lo splash
    		SwingUtilities.invokeLater(new Runnable() {
    			public void run() { setVisible(false); }
    		});		
    	} // FM
    	
    	private void container() {
    		container = new JPanel();
    		container.setBorder(BorderFactory.createLineBorder(colore));
    		container.setOpaque(true);
    	} //FM
    	
    	private void home() {		
    		GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
    		GraphicsDevice gd = ge.getDefaultScreenDevice();
    		final boolean possibile = gd.isWindowTranslucencySupported(TRANSLUCENT);
    		
    		setContentPane(container);
    		setUndecorated(true);
    		if (possibile) { setOpacity(0.8f); }
    		
    		new Posiziona(this);
    
    		setDefaultCloseOperation(JDialog.DO_NOTHING_ON_CLOSE);
    		setResizable(false);
    		pack();		
    		setAlwaysOnTop(true);
    	} // FM
    
    } // FC
    Non so dov'è l'errore,
    il JFrame con la JLabel e l'icona .gif di caricamento
    non vengono visualizzati!!!

  4. #4
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, ho dato un'occhiata veloce al metodo splashWaitAndStop:
    usi l'invokeLater per visualizzare lo splash, quindi non gestisci tu "quando" visualizzarlo,
    poi vai in wait, poi richiami di nuovo l'invokeLater per nascondere lo splash (forse il .dispose() è più indicato).
    Prova magari a mettere dei bellissimi system.out prima di ogni operazione per vedere in quale ordine vengono eseguite le istruzioni: scomemtto che prima viene fatto lo sleep, poi il setVisisble(true) e poi il setVisible(false).
    Voglio dire, forse sarebbe meglio fare una cosa del genere:
    codice:
    public void splashWaitAndStop() {
         setVisible(true);
         (new Thread() {
    			public void run() {
    				try {
    					Thread.sleep(duration);
    					setVisible(false);
    				} catch (InterruptedException e) {
    					e.printStackTrace();
    				}
    			}
          }).start();
    }
    Cioè, rendi subito visibile lo splash, e poi non richiami l'invokeLater (che usa lo event dispatch thread di swing) ma crei un nuovo thread (dal momento che utilizzi il Thread.sleep...) in cui prima addormenti il thread e poi rendi invisibile lo splash.
    In ogni caso ti consiglio una lettura sulla concorrenza in swing (http://docs.oracle.com/javase/tutori...ncy/index.html).

  5. #5
    Grazie Borras,
    ho modificato così il metodo splashWaitAndStop....
    codice:
    public void splashWaitAndStop() {
    	// visualizza lo splash
    	setVisible(true);
    		
    	class ThTimer implements Runnable {
    		public void run() {
    			try {
    				Thread.sleep(duration);
    				// nasconde e termina lo splash
    				setVisible(false);
    				dispose();
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	Thread th = new Thread(new ThTimer());
    	th.start();
    } // FM
    Funziona, cioè mi visualizza e poi nasconde e termina il JFrame,
    ma purtroppo ho il problema che assieme al JFrame dello splash
    mi apre la JDialog che dovrebbe aprirmi dopo!!!

  6. #6
    Utente di HTML.it
    Registrato dal
    May 2007
    Messaggi
    55
    Ciao, l'inizializzazione
    codice:
    new FrameC(false);
    dovresti farla dopo aver nascosto il jdialog e non nell'action listener.

  7. #7
    Ci avevo pensato,
    solo che non volevo spostare l'inizializzazione
    del JDialog nella Classe del JFrame (splash)
    anche perché volevo usare questa Classe per
    altri pannelli, cioè un riuso della Classe!!!

    Ho modificato così il metodo splashWaitAndStop ....
    codice:
    public void splashWaitAndStop(final int duration) {
    	// visualizza lo splash
    	setVisible(true);
    		
    	class ThTimer implements Runnable {
    		public void run() {
    			// creo il FrameC
    			FrameC frameC = new FrameC(false); // non visibile!!!
    			try {
    				Thread.sleep(duration*1000);					
    				// nasconde e termina lo splash
    				setVisible(false);
    				dispose();
    				frameC.setVisible(true); // rendo visibile il FrameC
    			} catch (InterruptedException e) {
    				e.printStackTrace();
    			}
    		}
    	}
    	Thread th = new Thread(new ThTimer());
    	th.start();
    } // FM
    Così istanzio il JDialog FrameC nella Classe dello "splash",
    ma se volessi usare la stessa Classe per un altro JDialog o
    JFrame che sia!!?

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.