Newsgroup: it.comp.java
Titolo: Splashscreen

Ciao a tutti,
ho realizzato una piccola applicazione in Java per la lettura di alcuni
files. Ho compattato tutto in un jar e lo voglio ditribuire ad alcuni miei
colleghi. Ora l'applicazione ci mette qualche secondo a partire e vorrei
far comparire, in fase di caricamento, uno splash screen carino con il
nome dell'applicazione.
Secondo voi basta caricare lo splash screen immediatamente nella main o
bisogna fare qualcosa di più sofisticato...
Grazie
Ciao
SnOcK

 SnOcK
Io l'ho messo nel main
ciao
-- 
questo articolo e` stato inviato via web dal servizio gratuito 
http://www.newsland.it/news
 segnala gli abusi ad 
ab...@newsland.it

 ciao
E quando lo fai sparire? Hai identificato un punto della tua applicazione
in cui sei sicuro che tutte le classi sono state caricate?
A me piacerebbe anche dare un feedback all'utente di quello che sta
facendo l'applicazione mentre lui guarda lo splashscreen, sai per non
dargli l'impressione che l'applicazione si sia bloccata. Qualcosa del tipo
"Loading...".
Grazie
Ciao
SnOcK

 "Loading...".
..bč, allora dovresti usare i Thread. quando fai partire l'applicazione 
devi creare un Thread per lei e uno per lo splash screen il quale 
controlla (ad esempio) una variabile static booleana "loaded".
quando la tua applicazione principale č sicura di aver completato il 
loading cambia lo stato della variabile e il Thread dello splash screen 
scompare...
questa č la prima idea venuta in mente... forse ho toppato su 
qualcosa... e poi devi essere in grado di usare i Thread, non so se c'č 
qualcosa di piů semplice.
Ciao a presto.
		Lorenzo - 
xelon.it

 Ciao
Dunque, io ho fatto cosi:
public class Biblioteca {
  boolean packFrame = false;
 
  public Biblioteca() {
    SplashScreen splashScreen = new SplashScreen();
    splashScreen.setSize( new Dimension( 300, 200 ) );
    splashScreen.centerSplashScreen();
    splashScreen.setVisible( true );
    splashScreen.update(splashScreen.getGraphics());
    Main frame = new Main();
 
    if (packFrame) {
      frame.pack();
    }
    else {
      frame.validate();
    }
    //Center the window
    Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
    Dimension frameSize = frame.getSize();
    if (frameSize.height > screenSize.height) {
      frameSize.height = screenSize.height;
    }
    if (frameSize.width > screenSize.width) {
      frameSize.width = screenSize.width;
    }
    frame.setLocation((screenSize.width - frameSize.width) / 2,
(screenSize.height -    frameSize.height) / 2);
    frame.setVisible(true);
    splashScreen.dispose();
  }
  /**Main method*/
  public static void main(String[] args) {
    try {
 
//UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
      UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
 
    }
    catch(Exception e) {
      e.printStackTrace();
    }
    new Biblioteca();
  }
}
Questo ti fa vedere lo spash e poi chiama il MainFrame.
Nello splash ci metti un'immagine, una label con 'avvio....' etc
lo splash deve estendere Window.
Ti puoi sbizzarire come vuoi.
Fammi sapere.


Mi sono spaccato la testa per tante notti, soprattutto perchè la
documentazione ufficiale,
non propone alcuna soluzione;
vi invio il codice da me scritto , sperando che vi possa essere di aiuto.
spero inoltre che sia chiaro, altrimenti scrivetemi.
---
modifiche da effettuare:
- il nome della fotografia
N.B. la fotografia deve essere nella stessa directory del file .class
---
CIAO CI SI SENTE.
codice:
// Scritto da Stefano Pizzamiglio (
jpi...@jpizza.org
)
// Web directory: 
http://www.jpizza.org
// data:  24/09/2002   BERGAMO -ITALY-
// java 1.4.0
// per problemi, bug, o modifiche contattatemi
// carico solo le librerie necessarie
import java.awt.*;
import java.awt.event.*;
class SplashScreenTest extends Window
{
 // nome della fotografia da visualizzare
 String immagine = "NOMEFOTOGRAFIA.jpg";
 Image splashImage;
 //costruttore
 public SplashScreenTest()
 {
   super(new Frame());
  // Carica l'immagine nell'istanza
  splashImage = Toolkit.getDefaultToolkit().getImage("NOMEFOTOGRAFIA.jpg");
  // Utilizzo un MediaTracker
  MediaTracker mt = new MediaTracker(this);
  mt.addImage(splashImage,0);
  try {
   mt.waitForID(0);
  } catch (InterruptedException e) {}
 }
 public void showSplashScreen()
 {
   // Calcola le dimensioni effettive
  int w = splashImage.getWidth(null);
  int h = splashImage.getHeight(null);
  // Dimensiona la finestra
  setSize(w,h);
  // Centra la finestra sullo schermo utilizzando toolkit
  Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
  setLocation((d.width - w) / 2,(d.height - h) / 2);
  // Mostra la finestra
  setVisible(true);
 }
 //distruttore
 public void hideSplashScreen()
 {
  setVisible(false);
  dispose();
 }
 public void paint(Graphics g)
 {
  g.drawImage(splashImage,0,0,null);
 }
 //main
 public static void main(String args[])
 {
  SplashScreenTest sst = new SplashScreenTest();
  sst.showSplashScreen();
  try
  {
   Thread.sleep(5000);
  } catch (InterruptedException e) {}
  sst.hideSplashScreen();
  System.exit(0);
 }
}

Io ho fatto cosi:
Ho creato una classe che estende JDialog e implementa Runnable e
ActionPerformed che ha un immagine come splashscreen e una JProgressBar.
Nel Main dell'applicazione, faccio prima partire il thread invocando lo
start() del JDIalog che ho creato (il mio run() lo vedi sotto), poi carico
le altri classi aggiornando la JProgressBar ogni volta che fa qualcosa.
Alla fine avvio l'actionPerformed con un oggetto della classe Timer in
modo che rimanga qualche secondo in vista.
Ricordati che dopo aver chiamato lo show() della tua applicazione devi
chiamare il toFront() del JDialog per rimetterlo in primo piano.
public void run() {
        this.show();
    }
public void actionPerformed(ActionEvent e) {
        this.dispose();
    }
-- 
Pietro	- 
http://pietro81.altervista.org
Linux Registered User #304991
Powered by *Mandrake GNU/Linux 9.1*