이미지 소스들은 다음과 같습니다. 개인 블로그로 링크를 겁니다.
http://adunhansa.tistory.com/156 <= 설명과 압축파일 있습니다.
1단계 메인 뷰 화면..(필요스킬 : 이미지 로딩 )
핵심 코드는 :
image = Toolkit.getDefaultToolkit().createImage("이미지위치값");
이것이었습니다. 일단 주어진 이미지를 로딩하는 것이었죠. JPanel 을 상속한 클래의 생성자에 이미지객체의 파일위치이름을 넣어주고 , 생성하여서 JFrame에서 로딩( add) 하는 것이었습니다.
//Thread 예 Thread 객체명 = new Thread(); 객체명.start(); //Runnable의 예, 밑의 객체는 Runnable을 구현했다. 타입 객체명 = new 타입(); new Thead(해당객체명).start(); //Runnable이 구현되어있기 때문에 안에 넣을 수 있다.
두번째, 세번째로 그냥 쓰레드를 이용한 이미지,텍스트처리를 하여 줍니다. JPanel을 상속하면서 Runnable을 구현하는 클래스를 만들어서 JFrame에는 add해주고, Runnable 객체로서는 run을 실행시켜서 스스로 움직이도록 구현이 된 것입니다....
음...이 부분은 뭐라 설명을 하기가 난감하네요... 그냥 좌표.. 숫자값의 변환이고 시간별로 이미지를 돌리는 그저 뻔한 구현이라서요...;
혹시라도 쓰레드가 아직 익숙하지 않으신 분을 위해 잠시 적자면 쓰레드를 동작하는 방식에는 두가지가 있죠.
Thread를 상속한 객체를 생성하고 객체명.start() 를 하거나.. Runnable을 구현한 객체를 생성하고 new Thread()안에 파라미터로 넣어주고 start()시키는 방법이었습니다.
처음 생성된 한개 짜리 클래스는 다음과 같습니다...
리팩토링 들어갈 것입니다.. (리팩토링 기대해주세요~~~) ㅎㅎㅎㅎ
package view;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JLayeredPane;
import javax.swing.JPanel;
@SuppressWarnings("serial")
public class ManageView extends JFrame {
public ManageView() {
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
setSize(1600, 900);
setTitle("ManageView");
setLayout(null);
// 내 윈도우 화면
Dimension frameSize = this.getSize();
Dimension windowSize = Toolkit.getDefaultToolkit().getScreenSize();
setLocation((windowSize.width - frameSize.width) / 2, (windowSize.height - frameSize.height) / 2);
JLayeredPane layeredPane = new JLayeredPane();
layeredPane.setBounds(0, 0, 1600, 900);
layeredPane.setLayout(null);
// 배경
JPanel myPanel = new MyPanel();
myPanel.setLayout(null);
myPanel.setBounds(0, -30, 1600, 900);
// 시계
ImgClock imgClock = new ImgClock();
imgClock.setLayout(null);
imgClock.setBounds(15, 20, 179, 149);
imgClock.setOpaque(false); // 배경이 투명처리
new Thread(imgClock).start();
// 시계 글씨
ClockMessage clockMessage = new ClockMessage();
clockMessage.setBounds(80, 53, 100, 100);
clockMessage.setOpaque(false);
new Thread(clockMessage).start();
// 움직이는 광원처리
MyStarPanel myStarPanel = new MyStarPanel();
myStarPanel.setLayout(null);
myStarPanel.setBounds(0, -30, 1600, 900);
myStarPanel.setOpaque(false);
new Thread(myStarPanel).start();
//TODO 여기도 계속 잡아줌
// 최종 삽입
layeredPane.add(myPanel, new Integer(0));
layeredPane.add(imgClock, new Integer(4));
layeredPane.add(clockMessage, new Integer(5));
layeredPane.add(myStarPanel, new Integer(3));
add(layeredPane);
}
public static void main(String[] args) {
new ManageView();
}
// 메인 배경 화면
class MyPanel extends JPanel {
Image image;
public MyPanel() {
image = Toolkit.getDefaultToolkit().createImage("img/mainHud_back.png");
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(image, 0, 0, this);
}
}
// 시계이미지
class ImgClock extends JPanel implements Runnable {
Image img[] = new Image[4];
int i = 2;
public ImgClock() {
img[1] = Toolkit.getDefaultToolkit().createImage("img/cl1.png");
img[2] = Toolkit.getDefaultToolkit().createImage("img/cl2.png");
img[3] = Toolkit.getDefaultToolkit().createImage("img/cl3.png");
img[0] = img[1];
}
@Override
public void paint(Graphics g) {
super.paint(g);
g.drawImage(img[0], 0, 0, this);
}
@Override
public void run() {
while (true) {
try {
Thread.sleep(10000);
switch (i) {
case 1:
img[0] = img[i];
i++;
repaint();
break;
case 2:
img[0] = img[i];
i++;
repaint();
break;
case 3:
img[0] = img[i];
i = 1;
repaint();
break;
}
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
// 시계글씨
class ClockMessage extends JPanel implements Runnable {
int i = Calendar.getInstance().get(Calendar.AM_PM);
String[] ampm = { "AM", "PM" };
SimpleDateFormat sdf = new SimpleDateFormat("hh:mm:ss");
String time = sdf.format(new Date());
JLabel timeLabel, ampmLabel;
public ClockMessage() {
this.setLayout(null);
timeLabel = new JLabel(time);
timeLabel.setBounds(0, 0, 100, 20);
timeLabel.setForeground(new Color(36, 205, 198));
timeLabel.setFont(new Font("배달의민족 한나", Font.BOLD, 12));
ampmLabel = new JLabel(ampm[i]);
ampmLabel.setBounds(15, 20, 100, 30);
ampmLabel.setForeground(new Color(36, 205, 198));
ampmLabel.setFont(new Font("배달의민족 한나", Font.BOLD, 12));
add(timeLabel, BorderLayout.NORTH);
add(ampmLabel, BorderLayout.CENTER);
}
@Override
public void run() {
do {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
timeLabel.setText(sdf.format(new Date()));
} while (true);
}
}
// 광원처리
class MyStarPanel extends JPanel implements Runnable {
Image img;
int i = 1;
int sleep = 25;
int sx = 77, sy=0;
public MyStarPanel() {
img = Toolkit.getDefaultToolkit().createImage("img/starDdong.png");
}
@Override
public void paint(Graphics g) {
super.paint(g);
if(img!=null) g.drawImage(img, sx, sy, this);
}
@Override
public void run() {
try {
do {
Thread.sleep(sleep);
switch (i) {
case 1: sy+=2; if(sy>791) i=2; break;
case 2: sx+=2; if(sx>1507) i=3; break;
case 3: sy-=2; if(sy<53) i=4; break;
case 4: sx-=2; if(sx<77) i=1; break;
}
repaint();
} while (true);
} catch (Exception e) {
System.out.println("무슨 에런지참. ");
}
}
}
// TODO 계속 들어감
}

