반응형
입력받은 클래스명으로 해당 클래스를 생성하는 코드이다.

클래스: java.lang.Class<T>
메소드:
static Class<> forName(String className)
//->지정된 캐릭터 라인명을 가지는 클래스 또는 인터페이스에 관련지을 수 있던,Class 객체를 돌려준다.
newInstance()  //-> 이 Class객체가 나타내는 클래스의 새로운 인스턴스 생성.

반응형
Jar 파일로 응용프로그램을 배포하다 보면 이미지 화일이나 프로퍼티 화일, 자료화일등을

함께 묶어서 배포할 경우가 있다. 해당 자원에 접근하기 위해서는 이전에도 포스팅한바가 있는

java.lang.ClassLoader을 이용해 해당 자원에 접근 할수 있다.

간단한 예를 보자.
ClassLoader loader = this.getClass().getClassLoader();
Icon tIcon = new ImageIcon(loader.getResource("res/tImag.git"));

그 외에도 ClassLoader.getResourceAsStream(String name) 메소드를 이용하여
InputStream을 통한 방법도 있다.

자바웹스타트 환경에서는 Java 2 SE API에서 제공하지 않는 추가적인 기능을 하는 API를
제공한다. 이것은 JNLP API라고 한다. JNLP API를 이용하여 개발할 경우는 jnlp.jar가
필요한데 이러한 파일은 JNLP Developer's Pack에 포함 되어 있다. 다음은 Developer's Pack을
다운로드 할 수 있는 URL이다.

http://java.sun.com/products/javawebstart/download-jnlp.html

  JNLP API가 추가적으로 제공하는 클레스는 javax.jnlp package로 묶여 있으며
BasicService, ClipboardService, DownloadService, FileOpenService, FileSaveService, 
PrintService, PersistenceService 등이 있는데 이들은 ServiceManager 클레스를 통하여
사용할 수 있다. 각각의 기능은 다음과 같다.

- javax.jnlp.BasicService

BasicService는 웹스타트의 환경적인 면이나 브라우져를 통제하기 위한 API를 제공하는데
자바 애플릿의 경우 AppletContext와 비슷한 역할을 한다. 다음 예제는 웹스타트 환경에서
웹브라우져로하여금 특정 URL로 가도록 하는 것이다.

import javax.jnlp.*;
.....

BasicService bs = (BasicService)ServiceManager.lookup("javax.jnlp.BasicService");
bs.showDocument(new URL("http://www.javanuri.com"));



- javax.jnlp.ClipboardService

ClipboardService는 시스템에서 사용하는 클립보드에서 복사 객체를 가져오거나 클립보드로
복사하는 서비스를 제공한다. 자바웹스타트는 이 기능을 사용할 때 보안을 위하여 경고창을
보여준다. 다음은 간단한 스트링을 클립보드에 복사하는 예제이다.

import javax.jnlp.*;
.............

ClipboardService cs = (ClipboardService)ServiceManager.lookup("javax.jnlp.ClipboardService");
StringSelection ss = new StringSelection("Hello Web Start");
cs.setContents(ss);


- javax.jnlp.DownloadService

DownloadService는 자신의 자원을 Cache에 저장, 삭제등 Cache를 통제할 수 있는 서비스 API를
제공하는 클레스이다. 다음은 myapp.jar를 Cache에서 확인하고 있으면 삭제한후 다시 Cache에
저장하는 예제이다.

import javax.jnlp.*;
...........

DownloadServicd ds = (DownloadService)ServiceManager.lookup("javax.jnlp.DownloadService");
URL url = new URL("http://www.javanuri.com/jws/myapp.jar");
boolean isCached = ds.isResourceCached(url, "1.0");
if(isCached) {
  ds.removeResource(url, "1.0");
}

DownloadServiceListener dsl = ds.getDefaultProgressWindow();
ds.loadResource(url, "1.0", dsl);


- javax.jnlp.FileOpenService

FileOpenService는 권한이 제약된 환경에서도 이를 사용자에게 알리고 화일을 열 수 있는
다이얼로그 윈도우를 열어주는 서비스이다.  다음 예제는 FileOpenService를 이용하여 화일을
여는 예제이다.

import javax.jnlp.*;
..............

FileOpenService fo = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fc = fo.openFileDialog(null, null);

- javax.jnlp.FileSaveService


FileSaveService는 권한이 제약된 환경에서도 local disk에 화일을 저장할 수 있는
기능을 제공하는 서비스 클레스이다. 이는 FileOpenService의 경우와 반대인 기능을 제공하는
클레스이다.  다음은 FileOpenService를 이용하여 화일을 연 후에 FileSaveService를
이용하여 화일을 저장하는 예제이다.

import javax.jnlp.*;
.....................

FileOpenService fo = (FileOpenService)ServiceManager.lookup("javax.jnlp.FileOpenService");
FileContents fc = fo.openFileDialog(null, null);
FileContents newfc = fss.saveFileDialog(null, null, fc.getInputStream(), "newfile.txt");

- javax.jnlp.PrintService

PrintService는 권한이 제약된 웹스타트 환경에서도 프린트를 가능하게 해주는 API 를 갖고 있는
서비스 클레스이다.  이 API를 이용하여 프린트를 요청하면 사용자에게 허가할 것인가를 묻는
다이얼로그가 나타난다. 다음은 PrintService를 이용한 프린트 요청 예제이다.

import javax.jnlp.*;
.....................

PrintService ps = (PrintService)ServiceManager.lookup("javax.jnlp.PrintService");

// default page format
PageFormat pf = ps.getDefaultPage();

// customizing page format
PageFormat npf = ps.showPageFormatDialog(pf);

// print
ps.print(new Doc());


// printable class
class Doc implements Printable {

 ....
 public int print(Graphics g, PageFormat fm, int idx) {
  ....
 }

}

}


- javax.jnlp.PersistenceService

PersistenceService는 브라우져의 쿠키와 마찬가지고 사용자의 클라이언트에 간단한 자료를 
저장할 때 사용된다. 저장되는 형태는 url형태로 자장된다.
다음은 간단한 url을 저장하고 내용을 읽어들이는 예제이다.


import javax.jnlp.*;
.....................

PersistenceService ps = (PersistenceService)ServiceManager.lookup("javax.jnlp.PersistenceService");

String addr = "www.javanuri.com/some.txt";
java.net.URL = new URL(addr);

// create
ps.create(url, 1024);
FileContents fc = ps.get(url);
OutputStream os = fc.getOutputStream(false);
os.write(...);

// read
fc = ps.get(url);
InputStream in = fc.getInputStream();

in.read(...);

.......


- javax.jnlp.FileContents

FileContents 는 FileOpenService, FileSaveService, PersistenceService와 같은 서비스에서 
input과 output을 처리할 수 있도록 만들어진 클레스이다. 일반적인 File 클레스와 비슷하게
생각하면 된다.  보안과 자료 저장 형태 등이 일반 File 클레스와는 다르다. 
반응형
업무 과정중에 디비에 데이터를 넣는 과정에서 한글 깨짐현상이 발생하였다.

문제는 2가지 정도가 발생하였는데 디비간의 데이터 이동시에 해당 컬럼의 사이즈가 서로 달랐던 것이다.

source db 는  varchar(100)  target db는 varchar(70)  그로인해 한글데이터가 잘리는 경우가 발생하여

깨짐 현상이 발생하였고 데이터를 처리하여 다른 테이블에 INSERT 과정에서 깨진 데이터는

INSERT 가 되지 않았다. 그래서 데이터를 byte단위로 잘라서 target 테이블에 insert 하여야 했다.

해서 입력된 String을 byte 단위로 잘라서 마지막에 깨진 글자가 있을시에 빼고 리턴하는 메소드를 작성.


그리고 2번째 문제가 발생하였는데 잘못된 한글 표기로 인코딩의 문제로 String 중간에 깨진 글자 발생
이 문제는 DB의 인코딩 방식과 JAVA에서 처리된 인코딩 방식의 차이로 발생 하였는데..

해당 소스가 실행되는 환경에서 어떤 인코딩에 따라 한글이 깨지는지 확인 해 보도록 하자.
반응형

이기종의 플랫폼과 연동할 이슈가 발생하면, 네트웍을 통한 Byte Ordering과 더불어 스트링의 인코딩/디코딩도 이슈거리입니다.  아래는 자바 API 5의 java.nio.charset.Charset 에 나오는 내용입니다.

표준 캐릭터셋
Java 플랫폼의 구현은 모두 다음의 표준 캐릭터셋를 지원 할 필요가 있습니다. 지원 되고 있는 그 외의 캐릭터셋에 대해서는 구현의 릴리스 노트를 참조하십시오. 그러한 옵션의 캐릭터셋의 동작은 구현 마다 다를 가능성이 있습니다.

캐릭터셋           설명
US-ASCII          7 비트 ASCII (ISO646-US/Unicode 캐릭터셋의 Basic Latin 블록)
ISO-8859-1      ISO Latin Alphabet No. 1 (ISO-LATIN-1)
UTF-8                8 비트 UCS 변환 형식
UTF-16BE        16 비트 UCS 변환 형식, 빅 endian 바이트순서
UTF-16BE        16 비트 UCS 변환 형식, little endian 바이트순서
UTF-16             16 비트 UCS 변환 형식, 옵션의 바이트순서 마크로 식별되는 바이트순서

아래코드는 예제입니다.
class CharSetTest {

    static String aa = "a1";

    static void testAscii() {
        try {
            byte[] bytes = aa.getBytes("US-ASCII");
            for(int i=0; i < bytes.length; i++) {
                System.out.print(bytes[i]);
            }

            System.out.println("");
        }catch(java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    static void testUTF8() {
        try {
            byte[] bytes = aa.getBytes("UTF-8");
            for(int i=0; i < bytes.length; i++) {
                System.out.print(bytes[i]);
            }

            System.out.println("");
        }catch(java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    static void testUTF16() {
        try {
            byte[] bytes = aa.getBytes("UTF-16");
            for(int i=0; i < bytes.length; i++) {
                System.out.print(bytes[i]);
            }

            System.out.println("");
        }catch(java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    static void testUTF16BE() {
        try {
            byte[] bytes = aa.getBytes("UTF-16BE");
            for(int i=0; i < bytes.length; i++) {
                System.out.print(bytes[i]);
            }

            System.out.println("");
        }catch(java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    static void testUTF16LE() {
        try {
            byte[] bytes = aa.getBytes("UTF-16LE");
            for(int i=0; i < bytes.length; i++) {
                System.out.print(bytes[i]);
            }

            System.out.println("");
        }catch(java.io.UnsupportedEncodingException e) {
            e.printStackTrace();
        }
    }

    public static void main(String[] args) {
        System.out.println("--- Ascii ---");
        CharSetTest.testAscii();
        System.out.println("--- UTF-8 ---");
        CharSetTest.testUTF8();
        System.out.println("--- UTF-16 ---");
        CharSetTest.testUTF16();
        System.out.println("--- UTF-16BE ---");
        CharSetTest.testUTF16BE();
        System.out.println("--- UTF-16LE ---");
        CharSetTest.testUTF16LE();
    }
}
아래 예는 화면결과 입니다.
--- Ascii ---
9749
--- UTF-8 ---
9749
--- UTF-16 ---
-2-1097049
--- UTF-16BE ---
097049
--- UTF-16LE ---
970490
< 출처: http://www.sjava.net/62 >
반응형

SWT 애플리케이션의 JWS를 통한 배포는 전통적인 자바 애플리케이션과 달리 OS의 리소스에 접근해야 한다.

시스템 리소스에 접근하기 위해서는 JWS 로 배포시 인증을 받아야 하며 이에 관한 한글 번역 문서를 찾아보았다.

아래 링크는 Java Web Start developer's Guide 한글 번역 문서이다.

http://xrath.com/javase/ko/6/docs/ko/technotes/guides/javaws/
반응형
Jar 파일에 리소스를 포함하여 배포하였을 경우 그 리소스에 접근하는 방법입니다.

예제코드:
package com.pmguda.resjar;

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.sound.sampled.*;
import java.net.*;

public class JarResourceLoading extends JFrame
    implements ActionListener {

    JButton button;
    ImageIcon buttonIcon;
    Clip buhClip;

    public final static String SOUND_PATH = "res/gudaMid.wav";
    public final static String IMAGE_PATH = "res/gudaImage.jpg";

    public JarResourceLoading () {
        super ("Resources from .jar");
        // get image and make button
        URL imageURL = getClass().getClassLoader().getResource (IMAGE_PATH);
        System.out.println ("found image at " + imageURL);
        buttonIcon = new ImageIcon (imageURL);
        button = new JButton ("Click to Buh!", buttonIcon);
        button.setHorizontalTextPosition (SwingConstants.CENTER);
        button.setVerticalTextPosition (SwingConstants.BOTTOM);
        button.addActionListener (this);
        getContentPane().add (button);
        // load sound into Clip
        try {
            URL soundURL = getClass().getClassLoader().getResource (SOUND_PATH);
            System.out.println ("found sound at " + soundURL);
            Line.Info linfo = new Line.Info (Clip.class);
            Line line = AudioSystem.getLine (linfo);
            buhClip = (Clip) line;
            AudioInputStream ais = AudioSystem.getAudioInputStream(soundURL);
            buhClip.open(ais);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void actionPerformed (ActionEvent e) {
        System.out.println ("click!");
        if (buhClip != null) {
            buhClip.setFramePosition (0);
            buhClip.start();
        }
        else
            JOptionPane.showMessageDialog (this,
                                           "Couldn't load sound",
                                           "Error",
                                           JOptionPane.ERROR_MESSAGE);
    }

    public static final void main (String[] args) {
        JFrame frame = new JarResourceLoading();
        frame.pack();
        frame.setVisible(true);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }

}
그림 1.


이클립스에서 jar 파일로 자동 배포 하였습니다. Jar 파일의 내부 구조도 이와 비슷하다.(압축을 풀어보면 알게된다.)

jar 파일안에 있는 이미지의 URL 은  Jar:file:/D:/resource.jar!/res/gudaImage.jpg

위의 코드에 대해 자세히 알아보고자 다른 자료를 찾아보았다.
다른 자료를 조금 인용하기 위해 긁어왔다.. 영문이다. ㅡㅡ;
해석해보면 그리 어렵지 않다. 위의 코드와 조금 다른 부분이 있을것이다. 잘 생각해 보자.


If you want to access a resource (configuration files, images, etc.) then you can certainly put it in a jar file, provided that jar file is in your classpath.

Then to access the resource, you can get a URL to it like this:
            URL url = this.getClass().getResource("/hello.jpg");
or you can get an InputStream to read it like this:
            InputStream is = this.getClass().getResourceAsStream("/app.properties");
Note that these methods will search for the resource in the directory tree relative to the package that "this" is in, so you will generally need the leading "/" to avoid that. But as for executable files in a jar file, forget it, there's no way to execute them from there. You can copy them out to a file and execute them from there, but that's the best you can do.


여기서 짚고 넘어가야 할 것은
패키지: com.pmguda.resjar
클래스: com.pmguda.resjar.JarResourceLoading
1.   getClass().getResource("gudaImage.jpg");
      현재 클래스의 위치에서 리소스를 찾는다
     클래스와 리소스의 위치가 같은 곳에 존재해야 한다.

2.   getClass().getResource("/res/gudaImage.jpg");
     패키지와 동일 루트에서 검색
3.   getClass().getClassLoader.getResource("res/gudaImage.jpg"); 
      패키지와 동일 루트에서의 상대 위치를 나타낸다.

java.lang.Class.getResource(String name)



번역이 완전하지가 않아 이해하기 어려울듯 하다.

java.lang.Class.getResource(String name)에서
name 가 "/gudaImage.jpg" 일 경우 절대 경로명(/gudaImage.jpg)으로 사용되고
"gudaImage.jpg" 일 경우 현 클래스의 위치에서 시작하는 상대경로가 되겠지요 이를
절대경로로
나타내면 (/com/pmguda/resjar/gudaImage.jpg)

java.lang.ClassLoader.getResource(String name)



1. getClass().getResource("/res/gudaImage.jpg"); 
2. getClass().getClassLoader.getResource("res/gudaImage.jpg"); 
동일한 URL을 리턴한다. 2번예시에서 앞에 "/" 을 넣어 시작하지 말도록 하자.
2번은 항상 상대경로만 인식하여 사용된다고 명심하시길..
ex)getClass().getClassLoader.getResource("/res/gudaImage.jpg");  

조금더 알아보고자 한다면 ClassLoader 에 대해 알아보는 것도 좋을듯 하다.
http://www.ibm.com/developerworks/kr/series/j-dclp.html?ca=dnn-krt-20071226

반응형
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
반응형

▶ 클래스 설계 요령 ◀

 

1. 데이터는 항상 private로 한다.

    이것은 매우 중요하다. 다른 식으로 하면 캡슐화가 깨지고 만다. 가끔 접근자나 변경자 메소드를 추가로 만들어야 하지만, 그래도 인스턴스 필드를 private로 만드는 것보다 훨씬 낫다. 데이터가 설명되는 방법이 변할 수도 있지만 사용되는 방법은 잘 변하지 않는다. 데이터가 private이면 그러한 설명의 변화는 클래스의 사용자에 영향을 미치지 않으며, 버그를 발견하기도 훨씬 쉽다.

 

2.항상 데이터를 초기화한다.

    자바는 지역 변수를 초기화 하지 않지만, 객체의 인스턴스 필드는 자동으로 초기화 한다. 하지만 이런 기본 값에 의존하지 말고 기본값을 제공하거나 모든 생성자에 기본값을 설정하는 방법으로 변수를 명시적으로 초기화해준다.

 

3. 클래스에 너무 많은 기본타입을 사용하지 말아야 한다.

    많은 기본타입의 관련된 사용을 다른 클래스로 바꾸자는 발상은 클래스를 더 이해하기 쉽고, 변경하기 쉽게 해준다. 예를 들어, Customer 클래스의 인스턴스 필드를 Address 라는 클래스로 바꾸자.

   private String street;

   private String city;

   private String state;

   private int zip;

 

 이렇게 하면, 주소가 국제 주소 쳬계로 바뀐다 해도 쉽게 이변화에 대처할수 있다.

 

4. 모든필드에 개별적인 접근자와 변경자가 필요한것은 아니다.

    사원의 급여를 가져오고 설정할 필요가있다. 물론 일단 객체가 생성되면 채용일은 변경할 필요가 없다.

 

5. 클래스 정의를 위해 표준형태를 사용한다.

    항상 다음과 같은 순서로 클래스의 내용을 나열한다.

        public 특성

        패키지 범위 특성

        private 특성

    각 영역은 다음과 같이 나열한다.

        인스턴스 메소드

        정적 메소드

        인스턴스 필드

        정적 필드

 

    선의 자바 프로그래밍 언어의 코딩 스타일 가이드는 필드를 먼저 나열하고 그 다음에 메소드를 나열하도록 권장한다. 어떤 스타일을 사용하든지 가장 중요한 것은 일관성을 유지하는 것이다.

 

6. 클래스를 아주 많은 역할로 나눈다.

     물론 "아주 많은"이라는 말은 모호하다. 하지만 하나의 복잡한 클래스를 개념적으로 더 간단한 클래스 두 개로 만들 수 있다면 그 방법을 사용해야 한다 (단 극단적으로 가면 안된다. 가각 한 메소드만 포함하는 클래스 10개는 지나치다는 것이다)

다음 예는 잘못 설계된 클래스이다

 

     public class CardDeck{   //잘못된 설계

           private int[] value;

           private int[] suit;

 

           public CardDeck(){....}

           public void shuffle(){......}

           public int getTopValue(){......}

           public int getTopSuit(){.....}

           public void draw(){......}

     }

 

     이 클래스는 두개의 분리된 개념을 구현하고 있다.. 하나는 shuffle과 draw메소드를 갖는 한벌의 카드(deck of cards)이며, 다른 하나는 card로 값과 카드의 패를 검사하는 메소드를 가지고 있다. 이것은 각각의 카드를 표현하는 Card 클래스를 도입하는 것은 의미가 있다. 이제 독자적인 임무를 갖는 두 클래스를 살펴보자

 

      public class CardDeck{

           private Card[] cards;

 

           public CardDeck(){...}

           public void shuffle(){.....}

           public Card getTop(){......}

           public void draw(){.......}

      }

 

      public class Card{

           private int value;

           private int suit;

 

           public Card(int aValue,itn aSuit){...}

           public int getValue(){.....}

           public int getSuit(){......}

     }

 

7. 클래스와 메소드의 이름은 그 임무에 맞게 부여한다.

    변수는 그것이  표현하는 것을 나타내는 의미 있는 이름을 가져야 하듯이 클래스도 마찬가지이다 (표준 라이브러리는 시간을 서술하는 Date 클래스처럼 약간 미심쩍은 클래스를 포함하고있다).Order  같은 명사를 사용하거나, RushOrder 처럼 선행 형용사를 수바한 명사 또는 Billing-Address 와 같은 동명사로 클래스 이름을 부여하는 것은 좋은 규칙이다. 메소드에 대한 표준 규칙은 접근자 메소드는 getSalary 처럼 소문자 get으로 시작하고, 변경자 메소드는 setSalary처럼 소문자 set으로 시작하는 것이다.

반응형
1. 첫번째 방법


2. 두번째 방법
반응형

SWT 애플리케이션의 개발 과정 중에서 특히, 기본적인 프로토타입을 완성한 이후에, 전개 시 발생될 수 있는 문제에 대하여 고려하여야 합니다. 전통적인 자바 애플리케이션과는 달리, SWT 애플리케이션은 애플리케이션이 작동하기 전에 OS 스팩의 라이브러리들이 로딩되어야 합니다. 이러한 라이브러리들을 지속적으로 전개 및 관리해야 한다는 것은 쉽지 않지만 Sun의 Java Web Start가 도움이 됩니다. SWT와 Java Web Start가 결합하면 클라이언트 측 자바 애플리케이션 구축하는 데에 훌륭한 툴이 됩니다.

SWT 개요

Standard Widget Toolkit (SWT)을 개발 커뮤니티로 도입하기가 여간 까다로운 것이 아니다. 그러한 근거로는 Sun은 Java Foundation Classes (JFC)로 클라이언트 측 애플리케이션 개발자들을 여러 해 동안 회유하고는 있지만, 많은 개발자들은 여러 가지 이유로 이 툴킷 사용을 피하고 있다. 많은 개발자와 아키텍트에게 있어서, 전통적인 데스크탑 애플리케이션처럼 작동하는 클라이언트 측 자바 애플리케이션을 개발하는 것은 아직도 꿈과 같은 일이다.

2001년 중반에, 이클립스 프로젝트가 갑자기 생겨나기 시작했다. 처음에, 이클립스 프로젝트는 자바용 유일한 오픈 소스 Integrated Development Environment (IDE)로 인식되었다. 하지만, 그의 프로젝트의 범위는 훨씬 더 광범위해 졌으며, SWT 툴킷을 탄생시켰다. JFC와 사촌격인 Abstract Window Toolkit (AWT)와 마찬가지로, SWT 툴킷은 개발자용 위젯을 제공한다. 하지만, SWT와 다른 툴킷들과의 주요한 차이점은 SWT가 OS GUI 위젯을 사용하는 방식이다. 이러한 방식은 자바 개발자들에게 크로스 플랫폼 API를 제공하여 원래의 데스크탑 애플리케이션인 것 같은 느낌을 주는 솔루션을 구현할 수 있도록 해준다.




위로


Java Web Start 개요

어떤 언어든, 올바른 툴이 없다면 데스크탑 애플리케이션의 전개와 관리는 개발자들에게 가장 큰 고민거리가 될 것이다. 지원 부서들 조차 새로운 버전의 소프트웨어가 릴리스 될 때 모든 워크스테이션을 업데이트 해야 한다는 생각에 사로잡혀 있으며, 배포 및 관리 요구 사항들을 완화시키기 위해서, 몇년 전 Sun Microsystems는 Java Web Start를 도입했다. 이 기술은 엔드 유저의 워크스테이션에서 자바 애플리케이션의 전개, 관리, 업그레이드를 단순화 한다.

애플리케이션을 시작하는 초기 툴로서 웹 브라우저를 사용하는 Java Web Start는 Sun의 Java Runtime Environment에 포함된 로컬에서 설치된 헬퍼 애플리케이션이다. Java Network Launching Protocol (JNLP) 파일에 액세스 할 때마다, 애플리케이션은 사용자 워크스테이션으로 자동 다운로드 되어 실행을 시작한다. 전체 프로세스는 엔드 유저와의 인터랙션에 대한 필요성이 줄어들었고, 애플리케이션 분산 과정도 단순화 되었다. (참고자료)




위로


파일 뷰어 애플리케이션

Java Web Start를 사용하여 SWT 애플리케이션을 전개하는 방법을 보기 전에, 우리가 전개할 애플리케이션에 대해 잠깐 보도록 하자. 이 글에 소개된 애플리케이션은 이클립스 프로젝트에서 제공하는 예제 애플리케이션이다. 그림 1에서 보듯, 이 애플리케이션은 크로스-플랫폼(cross platform) 파일 뷰어로서 사용자들이 하드 드라이브 상의 파일과 폴더를 볼 수 있도록 한다.


그림 1. Windows XP에서 실행되는 파일 뷰어
File Viewer

SWT와 Java Web Start의 크로스 플랫폼 기능을 설명하기 위해, 이 글의 예제 애플리케이션은 Microsoft Windows와 Red Hat Linux에서 실행되도록 패키징 되어 있다.




위로


환경 요구 사항

본 기사에서 기술한 코드는 하단부에 명기된 링크를 통하여 다운로드 할 수 있다. Java Web Start로 파일 뷰어 애플리케이션을 테스트 하려면, 다음과 같은 조건이 충족되어야 한다. (참고자료의 다운로드 링크 참조)

  • Microsoft Windows XP 또는 Red Hat Linux 8 OS
  • Java 2 SDK, Standard Edition 1.4 또는 이후 버전
  • Apache Ant 1.5.3 또는 이후 버전
  • Jakarta Tomcat 4.1.24 또는 이후 버전

Ant 빌드 스크립트를 크로스 플랫폼으로 만드는 것이 본 글의 목적이지만, 파일 뷰어 애플리케이션은 Microsoft Windows XP와 Red Hat Linux 8 OS에서만 테스트 및 확인되었다. 또한, Tomcat은 로컬 워크스테이션과 8080 포트에서 실행되는 것으로 간주한다. 예제 애플리케이션을 구현 및 설치, 실행해보자.




위로


파일 뷰어 애플리케이션 설치하기

파일 뷰어 애플리케이션을 설치하려면 다음 단계를 따른다.

  1. 참고자료 섹션에서 제공하는 링크를 통해 소스 코드 패키지를 다운로드 한다.
  2. fileviewer.zip 파일을 임시 디렉토리에서 압축을 푼다.



위로


보안과 코드 사인

AWT나 JFC와는 달리, SWT는 OS 본연의 윈도우 환경과 긴밀히 연관되어 있다. SWT는 시스템 라이브러리를 사용하여 플랫폼 독립 API와 기반 OS 간 통합을 관리한다. 기본적으로, Java Web Start에서 실행되는 애플리케이션은 제한된 샌드박스(sandbox)에서 실행된다. 이 환경은 워크스테이션의 파일 시스템, 시스템 라이브러리, 기타 리소스 같은 리소스로의 액세스를 제어한다. SWT는 시스템 라이브러리를 로딩하기 위해서 기본 샌드박스 밖에서 실행되어야 하므로, Java Web Start에 전개된 모든 JAR 파일들은 디지털 서명이 필요하다. 이 애플리케이션은 광범위한 사용자 베이스로 전개할 것은 아니므로 자체 서명 테스트 인증을 만들 것이다.

만일 여러분이 SWT 애플리케이션을 실행 환경에 설치하려면, Thawte 또는 VeriSign 같은 인증 기구에서 인증서를 받아두는 것이 좋다.




위로


자체 서명 인증서 만들기

자체 서명 테스트 인증서를 만들려면 다음과 같이 한다.

  1. 소스 코드의 압축을 풀었던 디렉토리에서 다음 명령어를 실행한다: keytool -genkey -keystore keystore -alias myself.

    패스워드, 이름, 위치를 포함한 새로운 키에 대한 상세를 요청하는 프롬프트가 뜬다. Ant 빌드 프로세스를 사용하려면, 패스워드를 "password"로 설정한다. 패스워드를 "password"로 하지 않으려면, build.xml 파일 내에서 "sign-jars"를 편집한다. 각 JAR 파일을 서명하는 실제 프로세스는 Ant 구현 동안에 완료된다.

  2. 키스토어(Keystore)가 올바르게 생성되었는지를 확인하려면 소스 코드 압축을 풀었던 디렉토리에 다음 명령을 실행한다: keytool -list-keystore keystore

    결과는 다음과 같다:

    Keystore type: jks
    Keystore provider: SUN
           
    Your keystore contains 1 entry
           
    myself, Jun 3, 2003, keyEntry,
    Certificate fingerprint (MD5):B8:C4:48:ED:68:E8:FE:47:83:78:F5:14:4E:28:5C:80




위로


파일 뷰어 애플리케이션 구현하기

파일 뷰어 애플리케이션을 구현하려면, 다음 단계를 따라간다.

  1. 환경을 삭제하려면, 소스 코드 압축을 풀었던 디렉토리에서 ant clean 명령을 실행한다.
  2. ant 명령을 실행하여 빌드 프로세스를 시작한다.

요구 사항에 부합하는 환경이 마련되고 올바르게 설정되었다면 다음과 같은 내용을 볼 수 있다.

Buildfile: build.xml

init:

compile-common:

compile-module:
     [echo] Compiling ...

package-common:

package-swtlib:

sign-jars:
     [echo] Signing JARS...
  [signjar] Signing Jar : D:\FileViewer\dist\swt-lib.jar
  [signjar] Signing Jar : D:\FileViewer\dist\fileviewer.jar
     [copy] Copying 1 file to D:\FileViewer\dist
  [signjar] Signing Jar : D:\FileViewer\dist\swt-win32.jar

package-web:
      [war] Building war: D:\FileViewer\dist\fileviewer.war

default:

BUILD SUCCESSFUL
Total time: 6 seconds




위로


파일 뷰어 애플리케이션 실행하기

Java Web Start를 사용하여 파일 뷰어 애플리케이션을 전개하기 전에, 애플리케이션을 로컬에서 실행해 보자. 애플리케이션을 시작하려면 소스 코드의 압축을 풀었던 디렉토리에서 ant run을 실행한다.

Ant 스크립트를 실행하면 파일 뷰어 애플리케이션이 나타난다. 그림 2는 Red Hat Linux 8에서 실행되는 애플리케이션 모습이다.


그림 2. Red Hat Linux 8에서 실행되는 파일 뷰어
File viewer on Red Hat 8



위로


파일 뷰어 애플리케이션 전개 및 테스트

애플리케이션을 Tomcat 4에 전개하려면 다음과 같이 한다.

  1. Tomcat 4에서 dist 디렉토리에서 webapps 디렉토리로 fileviewer.war 파일을 복사한다.
  2. 스크립트를 실행하여 Tomcat 4를 시작한다.
  3. 웹 브라우저에서 http://localhost:8080/fileviewer/index.html로 들어가서 "Launch Application" 링크를 클릭한다.

    링크를 클릭하고, 애플리케이션의 JAR 파일이 워크스테이션으로 다운로드 되는 동안 다음과 같은 이미지를 볼 수 있다.(그림 3)



    그림 3. 파일 뷰어
    File viewer

  4. 애플리케이션이 처음 다운로드 되면, 다음과 같은 대화 창이 나타난다. (그림 4)

    그림 4. 보안 경고
    Security warning

    "Start"를 클릭하여 파일 뷰어 애플리케이션을 시작한다.




위로


JNLP 파일 구현하기

Sun의 Java Web Start를 사용하여 SWT 애플리케이션을 구현, 배포, 전개하는 방법을 알아보았다. 이제는 JNLP 파일을 구현하는 방법에 대해 알아보자. Java Network Launching Protocol 스팩은 Java Community Process (JCP)에서 관리된다. 이 글의 목적은 이 기술을 사용하여 SWT 애플리케이션을 전개하는 방법을 설명하는 것이기 때문에 그 외 배경 설명은 생략하도록 하겠다. Java Web Start에 대한 자세한 내용은 Steve Kim의 기술자료 "Java Web Start"를 참조하라. (참고자료)

Listing 1은 SWT 애플리케이션의 JNLP 파일에서 사용되는 다양한 태그들이다.


Listing 1. index.jnlp 파일
				
1  <?xmlversion="1.0" encoding="utf-8"?>
2     <jnlp spec="1.0+"codebase="http://localhost:8080/fileviewer"href="index.jnlp">
3         <information>
4                 <title>File Viewer</title>
5                 <vendor>IBM developerWorks</vendor>
6                 <homepage href="index.html"/>
7                 <description>File Viewer</description>
8                 <description kind="short">FileViewer</description>
9         </information>
10        <security>
11                 <all-permissions/>
12         </security>
13         <resources>
14                 <j2se version="1.4"/>
15                 <jar href="fileviewer.jar"/>
16                 <nativelib href="swt-lib.jar"/>
17         </resources>
18         <resources os="Windows"> 
19                 <jar href="swt-win32.jar"/>
20         </resources>
21         <resources os="Linux"> 
22                 <jar href="swt-linux.jar"/>
23         </resources>
24         <application-descmain-class="org.eclipse.swt.examples.fileviewer.FileViewer"/>
25 </jnlp>

이 XML 파일에서 중요한 부분을 살펴보도록 하자.

  1. SWT 애플리케이션은 실행하는 동안 시스템 라이브러리를 로딩해야 하므로, 사용자의 워크스테이션으로 완전히 액세스 해야 한다. 라인 10에서 12번은 애플리케이션이 클라이언트의 환경에 액세스를 요청하는 방법을 나타낸다. Java Web Start가 액세스 허용을 받으려면, 모든 애플리케이션의 JAR 파일들은 디지털 서명이 되어야 한다.
  2. 라인 16번에서 보듯, nativelib 태그를 선언하여 Java Web Start에게 이 JAR 파일에 원래의 라이브러리들이 포함되어 있음을 알려주어야 한다. 예제 파일 뷰어 애플리케이션에서, 이 JAR 파일에는 Windows DLL과 리눅스용 SO 파일 시리즈가 포함된다.
  3. 라인 23번은 각 OS에 대한 SWT JAR를 로딩하는 부분이다. "resources" 태그를 사용하여 특정 OS와 아키텍처에서만 사용될 리소스들을 보호할 수 있다. os 애트리뷰트는 리소스 엘리먼트가 관여할 OS를 지정하며, 해당 값은 엔드 유저의 os.name 자바 시스템 프로퍼티에 기반한다. 이 예제에서는 사용되지 않지만, 자바 라이브러리로 액세스를 제한할 때 arch 애트리뷰트를 사용할 수 있다. arch 애트리뷰트는 엔드 유저의 os.arch 자바 시스템 속성에 기반한다.

JNLP 파일의 다양한 엘리먼트와 포맷에 대한 정보는 참고자료 섹션을 참조하라.




위로


요약

SWT 사용자 인터페이스 툴킷과 Java Web Start가 결합하면 상호 작용하는 클라이언트 측 자바 애플리케이션을 전개하는 훌륭한 툴이 된다. 예제 파일 뷰어 애플리케이션은 Java Web Start를 통해 분산될 독립형 SWT 애플리케이션을 구현하는데 사용할 수 있는 빌드 및 패키징 프레임웍을 제공한다.

기사의 원문보기





위로


다운로드 하십시오

이름 크기 다운로드 방식
os-jws/fileviewer.zip  FTP
다운로드 방식에 대한 정보


참고자료


<출처: http://www.ibm.com/developerworks/kr/library/os-jws/>

+ Recent posts