반응형
Wikipedia에 따르면 스플래시 스크린은 프로그램이나 운영체제가 로딩되는 동안 표시되는 이미지를 가리키는 컴퓨터 용어로서, 사용자에게 프로그램이 초기화되고 있다는 것을 시각적으로 보여주는 역할을 한다. Java SE 6(코드명 Mustang)가 출시되기 전에는 메인 메소드를 시작할 때 창을 만들고 그 속에 이미지를 배치하여 스플래시 스크린의 동작을 보여주는 것이 고작이었다. 이것도 나름대로 유용했지만, 창이 표시되기 전에 Java 런타임이 완전히 초기화될 필요가 있었다. 한편, 이 초기화 과정에는 AWT와 보통 Swing이 포함되어 초기 그래픽 디스플레이를 지연시키는 원인이 되었다. Mustang의 경우에는, 새로운 명령어 라인 옵션으로 이 기능을 훨씬 쉽게 만들어줄 뿐 아니라 사용자에게 이미지를 더 빠르게, 즉 Java 런타임이 시작되기도 전에 디스플레이를 가능하게 해준다. 이 기능이 최종적으로 포함되려면 JCP의 승인을 받아야 한다.

명령어 라인 옵션

명령어 라인으로 프로그램을 실행하면 -splash 명령어 라인 스위치를 통해 스플래시 스크린을 생성할 수 있다. 이 기능은 스크립트, 배치 파일, 바탕화면 바로가기 등을 이용해서 프로그램을 실행할 때 특히 유용하며, 명령어 라인 스위치 뒤에는 다음과 같은 이미지 이름이 온다.
   java -splash:Hello.png HelloWorld
-splash와 이미지 이름 사이에는 콜론이 들어간다. 이렇게 하면 런타임 환경이 완전히 초기화되기 전에 이미지가 즉시 디스플레이된다(화면의 중앙에 디스플레이됨). 스플래시 스크린 이미지에는 GIF, PNG, JPEG 등의 포맷이 사용될 수 있으며, 통상적인 Image 클래스와 마찬가지로 스플래시 스크린 이미지는 애니메이션, 투명(transparency), 반투명(translucency. Microsoft Windows 2000 또는 XP에서만 지원) 등의 효과를 지원한다. 애플리케이션이 첫 번째 창을 생성하면 스플래시 스크린은 사라진다.

JAR 파일 Manifest

일반적으로 대부분의 사용자는 명령어 라인 엔트리에 -splash를 삽입하기를 원치 않는다. 따라서, 보다 효과적으로 스플래시 스크린을 디스플레이하는 방법은 애플리케이션을 위한 manifest 파일을 생성한 다음 애플리케이션에 JAR 파일 내의 manifest와 이미지를 결합하는 것이다. 사용자가 JAR 파일로부터 애플리케이션을 론치할 때 스플래시 스크린이 표시되는데, 이 경우에는 사용자가 명령어 라인 옵션을 지정하지 않아도 된다.

manifest 파일 옵션은 SplashScreen-Image로 명명되고, 옵션 뒤에는 이미지 파일명이 온다. 파일이 JAR 파일의 톱 레벨에 있지 않을 경우에는 파일명의 전체 경로를 지정할 필요가 있다.

다음은 이 새로운 스플래시 스크린 기능들을 보여주는 간단한 예제이다 . 먼저, 다음 프로그램을 작성하도록 한다.
   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(300, 95);
           frame.setVisible(true);
        }
       };
       EventQueue.invokeLater(runner);
     }
    } 
이어서 프로그램을 컴파일한다.
    javac HelloSplash.java
그런 다음 명령어 라인 -splash를 시험해본다. 작업을 단순화시키기 위해, 프로그램과 동일한 디렉터리에 있는 스플래시 스크린 이미지를 사용한다.
   java -splash:MyImage.png HelloSplash
MyImage가 즉시 화면 중앙에 배치되고, 이어서 Java 런타임 환경이 초기화되고 나면 애플리케이션 화면이 표시되는 것을 알 수 있다.

My Image

Hello Splash

이제 JAR 파일 방식을 시험해 보기로 하자. 먼저 manifest를 위한 manifest.mf 파일을 생성한다. 파일의 내용은 다음과 같은 형태이어야 한다.
   Manifest-Version: 1.0
   Main-Class: HelloSplash
   SplashScreen-Image: MyImage.png
이어서 JAR 파일을 패키지한다.
   jar -mcvf manifest.mf Splash.jar HelloSplash*.class MyImage.png
그런 다음 -splash 명령어 라인 옵션을 지정하지 않고 JAR를 실행한다.
   java -jar Splash.jar
이전과 마찬가지로 스플래시 스크린에 이어서 애플리케이션 화면이 표시되어야 한다.

여러분의 JAR 파일이 manifest에 지정된 스플래시 스크린 이미지를 가지고 있고, 사용자가 명령어 라인에서 스플래시 이미지를 지정하는 경우에는 명령어 라인 이미지에 우선권이 주어지고 대신 표시된다.

고급 기능

대개의 경우에는 명령어 라인 -splash 및 manifest SplashScreen-Image 옵션으로 충분하지만, Mustang에는 더 많은 스플래시 스크린 기능이 들어 있다. java.awt 패키지는 단순히 스플래시 스크린 이미지를 보여주는 것 이상의 진보된 기능을 위한 SplashScreen 클래스를 제공한다.

-splash 명령어 라인 옵션이나 manifest의 SplashScreen-Image 옵션으로 이미지가 생성된 경우에는 SplashScreen 클래스의 getSplashScreen() 메소드가 생성된 화면을 반환한다. 이미지가 생성되지 않았다면 getSplashScreen()이 null을 반환한다.

다른 SplashScreen 메소드를 이용해서 스플래시 스크린과 관련된 다양한 사실을 알아낼 수 있다.
  • getBounds()는 스플래시 스크린 직사각형의 바운드를 반환한다.
  • getImageURL()은 스플래시 스크린 이미지의 URL을 반환한다.
  • getSize()는 스플래시 스크린 창의 크기를 반환한다.
  • isVisible()은 스플래시 스크린이 가시적인지 여부를 알려준다.
스플래시 스크린이 로드된 후에 이미지를 변경할 수 있지만, 이는 애플리케이션이 시작되기 전까지만 가능하다. 여기에는 두 가지 방법이 사용된다. setImageURL() 메소드는 디스플레이할 새 이미지에 대한 URL을 제공할 수 있게 해주고, 더 일반적인 두 번째 방법은 getGraphics() 메소드를 호출하여 창의 그래픽 컨텍스트(java.awt.Graphics)를 얻는 것이다. 그런 다음 통상적인 그래픽과 Java 2D API를 통해 이미지를 업데이트하는데, 그 이유는 이것이 단순한 java.awt.Graphics가 아니라 Graphics2D의 인스턴스이기 때문이다. 그래픽 컨텍스트에 드로우(draw)한 후 SplashScreenupdate() 메소드를 호출하여 업데이트된 이미지를 드로우한다.

다음은 스플래시 스크린에 표시되는 일련의 색상을 순환하는 후반의 동작을 보여주는 예제이다. 이것이 프로그레스 바, 또는 애플리케이션 초기화의 진행 상태를 나타내는 다른 상태 데이터를 디스플레이하는 것을 상상해보라.
   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(50, 50, 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(300, 95);
           frame.setVisible(true);
         }
       };
       EventQueue.invokeLater(runner);
     }
   }
color Splash

스플래시 스크린 이미지 위에서 어떻게 드로잉이 이루어지는지 주목할 것.

예제는 색상 순환이 완료된 후의 프레임을 보여주는데, 이는 시동 과정의 전형적인 양상으로, 초기화가 완료된 후 프레임이 표시되면서 스플래시 스크린을 가리게 된다.

마지막으로 언급할 SplashScreen 옵션의 경우 close() 메소드가 사용되는데, 창을 닫고 관련된 리소스를 해제하고자 할 경우에 이 메소드를 호출할 수 있다. 첫 번째 창이 가시적으로 되면 이 메소드가 자동으로 호출되기 때문에 굳이 호출할 필요는 없다.

스플래시 스크린을 이용하는 방법에 관한 자세한 내용은 테크니컬 아티클 “Mustang의 새로운 스플래시 스크린 기능(New Splash-Screen Functionality in Mustang)”을 참조하기 바란다. 아울러, SplashScreen 클래스를 위한 javadoc을 함께 참조할 것.

<출처: http://blog.sdnkorea.com/blog/171 >

참고자료로 구글링을 하면서  스플래시 스크린 자료를 찾았다.
http://www.jcreator.co.kr/tag/Splash%20Screen 
<이전 스플래시 스크린 자료 -window 클래스를 이용 >
http://www.devdaily.com/java/edu/SplashScreen
http://www.javapractices.com/topic/TopicAction.do?Id=149

+ Recent posts