티스토리 뷰

앞서 프레임자체에서 introPanel을 생성하여 추가 하였는데.

이런 frame에 view를 변경하거나 추가하는 일을 Controller클래스로 위임하기로 하였다.

일단 바뀐 코드를 보겠다.

--MainFrame Class--

import java.awt.Point; import java.awt.Dimension; import javax.swing.JFrame; public class MainFrame extends JFrame{ viewController controller; //생성자로 프레임의 이름을 받아 그대로 부모클래스로 전달해준다. //super() <- 부모클래스의 생성자를 호출하는 것 public MainFrame(String title) { super(title); //윈도우상의 창의 위치를 잡아준다. this.setLocation(new Point(600,250)); //프레임을 보여준다. default = false this.setVisible(true); //프레임의 창크기를 설정한다. this.setPreferredSize(new Dimension(400,400)); //컴포넌트 크기만큼 창의 크기를 잡아준다. this.pack(); //프레임창을 닫을 경우 프로세스를 종료하기 위해 사용해야한다. this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //뷰컨트롤러 등록 controller = new viewController(this); } //매인메소드. public static void main(String args[]){ //창을 띄우려면 메모리를 잡아야 하므로 자기자신클래스를 생성 MainFrame mainFrame = new MainFrame("게임"); } }

앞에 글에서는 MainFrame클래스 자체에서 ContentPane을 가져온 뒤 IntroPanel을 추가하였는데 Controller 클래스를 생성하여 view컨트롤에대한 일들을 맡겼다.

--viewController Class--

import java.awt.Container;
public class viewController {
	MainFrame mainFrame;  //매인프레임 생성자로 받을예상
	Container contentPane; //contentPane
	IntroPanel introPanel; //시작 패널
	public viewController(MainFrame mainFrame) {
		this.mainFrame = mainFrame; //생성자로 매인프레임을 받는다
		init();
	}
	private void init(){
		introPanel = new IntroPanel(); //시작패널 생성
		contentPane = mainFrame.getContentPane(); //매인프레임으로부터 컨텐트페인을 가져온다
		contentPane.add(introPanel); //컨텐트패인에 시작패널 추가
		introPanel.requestFocus();   //키이벤트를 받기위해 패널을 포커싱해준다.(패널에 이벤트가 달려있기때문에)
	}
}


이제 키이벤트를 넣어 인트로화면에서 메뉴를 선택하는 효과를 만들자

키이벤트를 처리하기위해 keyListener 를 구현한 클래스를 만들어야한다.

--IntroKeyEvent Class--

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


public class IntroKeyEvent implements KeyListener{
	IntroPanel introPanel; //패널을 생성자로 받음.
	public IntroKeyEvent(IntroPanel introPanel) {
		this.introPanel = introPanel;
	}
	@Override
	public void keyPressed(KeyEvent e) {
		//키값이 40 즉,방향키 위쪽 이면
		if(e.getKeyCode() == 38){
			introPanel.select =0;
		//키값이 38 즉,방향키 아래쪽 이면
		}else if(e.getKeyCode() ==40){
			introPanel.select= 1;
		}
		//패널을 다시 그려준다.
		introPanel.repaint();
	}
	@Override
	public void keyReleased(KeyEvent e) {
	}
	@Override
	public void keyTyped(KeyEvent e) {
	}

}

코드를 간단히 설명하자면 키입력이 발생할경우. 발생한 이벤트의 키값을 이용하여

위쪽,아래쪽 방향키를 판별하여  Intro 패널의 select 변수를 바꾸어 주고 Panel을 다시 그려준다.(repaint메소드)

그리고 이제 이 이벤트를 Panel에 추가한다.

추가코드 위치를 설명하는것이 더 복잡할거 같기때문에 전체코드를 적는다.

--IntroPanel Class---

import java.awt.*;

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;

import javax.swing.*;

//Panel단위로 화면이동을 하기위해 각화면은 Panel을 
//상속받아 클래스를 작성한다
public class IntroPanel extends JPanel{
	int select =0;
	Image intro_image;
	public IntroPanel() {
		//기본툴킷 객체로부터 getImage메소드를 활용하여 이미지를 불러온다.
		intro_image = Toolkit.getDefaultToolkit().getImage("intro_image.jpg");
		this.addKeyListener(new IntroKeyEvent(this));
	}	
	//패널의 paint 메소드를 오버라이드 하여 그려줌
	//메소드가 실행될때 Graphics타입의 g를 인자로 받는다
	//g를 이용하여 패널에 그려준다.
	@Override
	public void paint(Graphics g) {
		//이미지를 그려준다. 이미지객체,시작x,시작y,가로,세로,보여줄 옵저버;
		g.drawImage(intro_image,0,0,getWidth(),getHeight(),this);
		//g객체에 폰트스타일을 바꾸어준다. 이코드에서는 굵은글씨에 30포인트
		g.setFont(new Font("myFont",Font.BOLD ,30));
		//폰트셋을 빨강으로 변경
		g.setColor(Color.red);
		//문자열 삽입!!
		g.drawString("카드 게임", 120, 100);
		//폰트변경후 문자열 삽입.
		g.setFont(new Font("secondFont",Font.ITALIC,20));
		g.setColor(Color.black);
		g.drawString("GameStart",130,250);
		g.drawString("Quit",130,300);
		//기본값 게임시작바로 옆에 화살표를 위치시킨다
		if(select ==0)
			g.drawString("→", 100, 250);
		else //아닐경우
			g.drawString("→", 100, 300);
	}
}

paint 메소드 아래에 if문은 select 변수에 따라 화살표를 보여주는 위치를 다르게 한다

--실행 결과--



'내맘대로 게임(Java)' 카테고리의 다른 글

CardGame(완성.)  (0) 2014.08.19
Java로 만들어본 CardGame(4)  (0) 2014.07.22
Java로 만들어본 CardGame(2)  (0) 2014.07.20
Java로 만들어본 CardGame(1)  (0) 2014.07.20
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2025/01   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함