자바로 PC방 프로그램만들기

4초식. [뷰] 메인관리 화면 만들기

이미지 소스들은 다음과 같습니다. 개인 블로그로 링크를 겁니다.

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 계속 들어감

}

 

 

 

 

 

 

댓글

댓글 본문
  1. 아라한사
    예 감사합니다. 제가 스윙을 한지 좀 시간이 지나서 가물가물하지만, 아마도 제이패널을 새로 불러올 때 자동으로 페인트를 할 것입니다.

    repaint 할때도 저 안에 있는 메소드들을 작동시킬 것이구요..
    그림을 그리는 생성자같은 느낌으로 기억합니다.
    대화보기
    • nontile
      좋은강의 감사드립니다

      MyPanel 클래스에서 paint메소드는 자동으로 동작하는건가요?
      사용한흔적이 없어서요
      원리가 궁금합니다