Splash Screens e o Java S.E. 6.0 (Mustang)

De acordo com a Wikipedia, um splash screen é uma funcionalidade que permite a exibição de uma imagem quando um programa estiver sendo carregado. Isto serve para o usuário como um indicador visual que o programa está sendo inicializado. Antes de Java 6 S.E. (conhecido como Mustang) você só podia oferecer a funcionalidade do splash screen criando uma janela no início de seu método principal e colocando uma imagem nela. Embora isto funcionasse corretamente, era necessário que o runtime do Java estivesse completamente incializado para que a imagem fosse apresentada, atrasando dessa forma a exibição da tela de apresentação do programa. Com o Mustang, uma nova opção de linha de comando torna esta funcionalidade do splash screen muito mais fácil, reduzindo também o tempo de atraso para exibição da tela de apresentação.

Opção de Linha de Comando
Se você executar um programa na linha de comando, você pode gerar um splash screen através da chamada –splash na linda de comando. Esta funcionalidade é a mais útil quando você está usando um script, um batch file, ou um atalho para executar o programa. O comando –splash é seguido por um nome da imagem. Isto pode ser visto no trecho apresentado abaixo:

   java -splash:Hello.png HelloWorld

Sim, aquele entre o comando –splash e o nome da imagem é um dois pontos. Isto faz com que a imagem desejada seja apresentada antes que o ambiente de execução esteja completamente inicializado. A imagem indicada é centralizada na tela. As imagens do splash screen podem ter os formatos de GIF, png, ou JPEG. Como também suporta animações e alguns efeitos como a transparência por exemplo. O splash screen irá desaparecer quando a primeira janela é criada pela aplicação.

Arquivos JAR
Tipicamente a maioria dos usuários não desejam digitar -splash em sua linha de comando. Dessa forma, uma maneira mais eficaz de apresentar um splash screen, é criar um arquivo manifest para uma aplicação, e combinar então a aplicação com o arquivo manifest e a imagem em um um arquivo JAR. Quando um usuário executa a aplicação a partir de um arquivo JAR, o splash screen aparece. Neste caso, o usuário não precisa especificar uma opção na linha de comando.

O arquivo manifest é chamado de SplashScreen-Image. A opção é seguida pelo nome de arquivo da imagem. O caminho completo do nome de arquivo necessita ser especificado se o arquivo não estiver no nível superior do arquivo JAR.

Este é um exemplo simples que demonstra estas novas características do splash screen.  Primeiramente, crie o seguinte programa:

   import javax.swing.*;
   import java.awt.*;
   
   public class HelloSplash {
     public static void main(String args[]) {
       Runnable runner = new Runnable() {
         public void run() {
           try {
               Thread.sleep(1500);
           catch (InterruptedException e) {
           }
           JFrame frame = new JFrame("Splash Me");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           JLabel label = new JLabel(
                "Hello, Splash", JLabel.CENTER);
           frame.add(label, BorderLayout.CENTER);
           frame.setSize(30095);
           frame.setVisible(true);
        }
       };
       EventQueue.invokeLater(runner);
     }
    

Depois, compile o programa:

    javac HelloSplash.java

Então tente executar o comando -splash. Para facilitar, use uma imagem que esteja no mesmo diretório que o programa (esta não é uma exigência):

   java -splash:MinhaImagem.png HelloSplash

Você verá a imagem escolhida sendo apresentada no centro da tela. Essa imagem ira desaparecer logo que o ambiente de execucao Java estiver completamente inicializado, apresentando logo em seguida a tela do programa. Isto pode ser visto na figura a seguir.

splash1.JPGsplash2.JPG

Agora vamos tentar fazer isto utilizando um JAR. Crie primeiramente um arquivo manifest.mf para o comportamento. Os índices do arquivo devem estar da seguinte forma:

Manifest-Version: 1.0 Main-Class: HelloSplash SplashScreen-Image: MinhaImage.png

Logo apóis gere o arquivo JAR:

jar -mcvf manifest.mf Splash.jar HelloSplash*.class MinhaImagem.png

Depois execute o JAR sem especificar o commando –splash na linha de comando:

java -jar Splash.jar

Como aconteceu antes, voce vera o splash screen seguido pela tela da aplicacao.

Se seu arquivo JAR tiver uma imagem para o splash screen especificada no seu manifest, e um usuário especificar uma imagem para o splash screen na linha de comando, a imagem da linha de comando terá maior prioridade, sendo assim apresentada.

Embora o comando -splash e os manifests SplashScreen-Image sejam suficientes para a maioria de necessidades, eles servem basicamente para apresentar telas de inicializacao no Mustang. O pacote java.awt oferece uma classe chamada SplashScreen para uma funcionalidades mais avançadas além de simplesmente de mostrar uma imagem.

Desde que uma imagem seja passada pelo comando –splash ou pela opção do SplashScreen-Image no manifesto, o método getSplashScreen() da classe de SplashScreen retorna a tela gerada. Se nenhuma imagem for passada, o getSplashScreen() retorna vazio.

Usando outros métodos de SplashScreen, você pode descobrir várias coisas relacionadas a um splash screen:

·          getBounds() - retorna os limites do retângulo do splash screen.

·          getImageURL() - retorna a URL da imagem passada para o splash screen.

·        getSize() - retorna o tamanho da janela do splash screen.

·        isVisible() - indica se o splash screen estah visivel.

Você pode mudar a imagem mostrada depois que o splash screen estiver carregado, mas antes que a aplicação comece. Você tem duas maneiras fazer isto. Uma delas é através do método setImageURL() que permite que você forneça um URL para uma nova imagem a ser exibida. A segunda opcao, eh através do método getGraphics() para obter o contexto dos gráficos (java.awt.Graphics) da janela.

Este é um exemplo do último comportamento, que dá um ciclo através de um grupo das cores no splash screen. Com isso, você pode indicar uma barra do progresso ou alguns outros dados do estado que indicam o progresso da iniciação da aplicação.

   import javax.swing.*;
   import java.awt.*;
   import java.awt.geom.*;
   import java.util.*;

   public class ExtendedSplash {
     public static void main(String args[]) {
       Runnable runner = new Runnable() {
         public void run() {
           Random random = new Random();
           SplashScreen splash = SplashScreen.getSplashScreen();
           Graphics2D g = (Graphics2D)splash.getGraphics();
           Dimension dim = splash.getSize();
           Color colors[] = {Color.RED, Color.ORANGE, 
             Color.YELLOW, Color.GREEN, Color.BLUE, 
             Color.MAGENTA};
           for (int i=0; i<100; i++) {
             g.setColor(colors[i % colors.length]);
             g.fillRect(5050, dim.width-100, dim.height-100);
             splash.update();
             try {
               Thread.sleep(250);
             catch (InterruptedException ignored) {
             }
           }
           JFrame frame = new JFrame("Splash Me2");
           frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
           JLabel label = 
             new JLabel("Hello, Splash", JLabel.CENTER);
           frame.add(label, BorderLayout.CENTER);
           frame.setSize(30095);
           frame.setVisible(true);
         }
       };
       EventQueue.invokeLater(runner);
     }
   }


splash3.JPG

Observe como o desenho é feito sobre a imagem do splash screen.

Depois que o ciclo da cor estiver completo, o exemplo mostra o frame. Isto é típico de um processo de inicialização: depois que a iniciação termina, o frame é apresentado, escondendo o splash screen apresentado.

Para mais informações sobre splash screens veja o javadoc da classe SplashScreen.