============================================================================
============================================================================
Java에서 이미지를 그릴 때, getImage 메소드는 실행되는 즉시 이미지를 서버로부터 사용자 시스템으로
전송하지 않는다. 실제로 그 이미지를 사용할 때 로드가 되는데, 만약 넷트웍 정체로 인해 이미지 로딩이
다 안된 상태에서 paint메소드가 호출되어 drawImage 메소드를 실행한다면 drawImage의 return값은
false가 된다. 즉, 이미지가 그려지지 않았다는 것이다.
이것은 Java의 MediaTracker 라는 도구를 이용하여 해결 할 수 있다.
MediaTracker는 일종의 유틸리티 클래스로서, 각종 Image 데이터나 AudioClip(음향) 데이터 등의 현 상태를
추적할 수 있다.
[예제]
import java.applet.*;
public class DrawImageTmp extends Applet {
private MediaTracker tracker;
private Image imgSmile;
private boolean isLoaded;
public void init() {
resize(200, 200);
}
public void start() {
tracker = new MediaTracker(this); // MediaTracker 객체를 생성한다
imgSmile = getImage(getCodeBase(), "Smile.GIF"); // 그림을 애플릿으로 가져온다
tracker.addImage(imgSmile, 0); // 그림을 MediaTracker에 등록한다
isLoaded = false; // 이미지의 로드완료 여부를 나타내는 flag
// 이미지가 로드 될 때까지 기다린다
try {
tracker.waitForID(0);
} catch (InterruptedException ie) {}
isLoaded = true;
}
public void paint(Graphics g) {
// 이미지 로드에 실패했다면 화면을 빨간색으로
if ((tracker.statusAll(true) & MediaTracker.ERRORED) != 0) {
g.setColor(Color.red);
g.fillRect(0, 0, size().width, size().height);
return;
}
if (isLoaded) {
g.drawImage(imgSmile, 0, 0, this); // 이미지가 로드 됐다면 화면에 그린다
} else {
g.drawString("Loading Image....", 0, 0); // 로드중이면 메시지 출력
}
}
}
☞ MediaTracker(Component comp)
MediaTracker 클래스는 Image, AudioClip 등의 상태를 관리하는 기능을 가진 유틸리티 클래스이다.
객체를 생성할 때 이미지가 그려질 Component객체를 인수로 넘겨줘야 한다.
☞ MediaTracker.addImage(Image image, int id)
이미지를 등록하는 메소드이다. 각각의 이미지마다 고유의 숫자 ID를 부여할 수 있고, 함께 로드 할 이미지들일
경우 같은 ID를 부여해 한꺼번에 관리할 수도 있다.
☞ MediaTracker.waitForID(int id)
주어진 ID의 이미지가 로드될때까지 기다리는 메소드이다.
또 해당 아이디가 부여된 이미지 중 로드가 되지않은 것이 있다면, 이들을 로드하도록 한다.
waitForID 메소드는 이미지의 로드가 끝나지 않고 중단된 경우 InterruptedException을 발생시키므로
try - catch 문을 사용해야 한다.
☞ MediaTracker.waitForAll()
waitForID메소드는 ID별로 관리를 하지만 waitForAll 메소드는 현재 MediaTracker 에 등록된 모든 이미지들이
로드 완료 될때까지 기다리게 한다.
☞ MediaTracker.statusAll(boolean load)
MediaTracker에 등록된 모든 미디어들에 대한 상태를 리턴한다.
statusAll 메소드에 의해 넘어오는 미디어들의 상태는 4가지이다.
- MediaTracker.LOADING : 미디어가 로드되는 중
- MediaTracker.ABORTED : 미디어의 로드를 취소
- MediaTracker.ERRORED : 미디어를 로드하는 도중 오류가 발생
- MediaTracker.COMPLETE : 미디어 로드를 완료
* 이미지 생성
Image iconImage = Toolkit.getDefaultToolkit().getImage(new URL("http://" + MapViewer.codeBase + "/MapViewer/image/phone_02.png"));
============================================================================
java.awt
Class MediaTracker
java.lang.Object java.awt.MediaTracker
- All Implemented Interfaces:
- Serializable
public class MediaTracker
- extends Object
- implements Serializable
- extends Object
The MediaTracker
class is a utility class to track the status of a number of media objects.
Media objects could include audio clips as well as images, though currently only images are supported.
To use a media tracker, create an instance of MediaTracker
and call its addImage
method for each image to be tracked. In addition, each image can be assigned a unique identifier.
This identifier controls the priority order in which the images are fetched. It can also be used to identify unique subsets of the images that can be waited on independently.
Images with a lower ID are loaded in preference to those with a higher ID number.
Tracking an animated image might not always be useful due to the multi-part nature of animated image loading and painting, but it is supported. MediaTracker
treats an animated image as completely loaded when the first frame is completely loaded. At that point, the MediaTracker
signals any waiters that the image is completely loaded. If no ImageObserver
s are observing the image when the first frame has finished loading, the image might flush itself to conserve resources (see Image.flush()
).
Here is an example of using MediaTracker
:
import java.applet.Applet; import java.awt.Color; import java.awt.Image; import java.awt.Graphics; import java.awt.MediaTracker; public class ImageBlaster extends Applet implements Runnable { MediaTracker tracker; Image bg; Image anim[] = new Image[5]; int index; Thread animator; // Get the images for the background (id == 0) // and the animation frames (id == 1) // and add them to the MediaTracker public void init() { tracker = new MediaTracker(this); bg = getImage(getDocumentBase(), "images/background.gif");
// 식별자를 넣어서 로딩의 순서를 제어 할 수 있는 이미지 그룹을 만들수 있다. tracker.addImage(bg, 0); for (int i = 0; i < 5; i++) { anim[i] = getImage(getDocumentBase(), "images/anim"+i+".gif"); tracker.addImage(anim[i], 1); } } // Start the animation thread. public void start() { animator = new Thread(this); animator.start(); } // Stop the animation thread. public void stop() { animator = null; } // Run the animation thread. // First wait for the background image to fully load // and paint. Then wait for all of the animation // frames to finish loading. Finally, loop and // increment the animation frame index. public void run() { try { tracker.waitForID(0); // 식별자가 0인 이미지 그룹을 로딩할 때까지 기다림 tracker.waitForID(1);
// tracker.waitForAll(); // 모든 이미지 파일을 로딩 할 때까지 기다린다. } catch (InterruptedException e) { return; } Thread me = Thread.currentThread(); while (animator == me) { try { Thread.sleep(100); } catch (InterruptedException e) { break; } synchronized (this) { index++; if (index >= anim.length) { index = 0; } } repaint(); } } // The background image fills the frame so we // don't need to clear the applet on repaints. // Just call the paint method. public void update(Graphics g) { paint(g); } // Paint a large red rectangle if there are any errors // loading the images. Otherwise always paint the // background so that it appears incrementally as it // is loading. Finally, only paint the current animation // frame if all of the frames (id == 1) are done loading, // so that we don't get partial animations. public void paint(Graphics g) { if ((tracker.statusAll(false) & MediaTracker.ERRORED) != 0) { g.setColor(Color.red); g.fillRect(0, 0, size().width, size().height); return; } g.drawImage(bg, 0, 0, this); if (tracker.statusID(1, false) == MediaTracker.COMPLETE) { g.drawImage(anim[index], 10, 10, this); } } }
============================================================================
'IT_Programming > Java' 카테고리의 다른 글
Java로 구현한 JavaScript의 escape()와 unescape() (0) | 2010.06.17 |
---|---|
XML Parsing 관련 예제 코드 (0) | 2010.05.04 |
[펌] SWING에서의 쓰레드 핸들링 (0) | 2010.04.23 |
[펌] Concurrency in Swing (0) | 2010.04.23 |
JavaDOC 사용하기 (0) | 2010.03.15 |