이미지 소스들은 다음과 같습니다. 개인 블로그로 링크를 겁니다.
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 계속 들어감 }