본문 바로가기

언어공부/Java

자바 swing(스윙)- 그래픽 프로그래밍, 자바 좌표계

자바 그래픽 프로그래밍에 대해서 알아보자.

그래픽 프로그래밍

프레임 위에 그래픽으로 표시해보자. 일단 자바에서는 프레임은 다른 컴포넌트를 넣어두는 컨테이너의 역할로 설계되었다. 따라서 다른 컴포넌트 위에 그린 후에 그 컴포넌트를 프레임에 추가하는 것이 좋다.  JPanel은 그림을 그릴 수 있는 서피스를 가지고 있고, 동시에 컨테이너의 역할을 하기 때문에 버튼이나 텍스트 필드와 같은 컴포넌트를 넣을 수 있어 사용자 인터페이스와 그래픽을 동시에 구현할 수 있다. JFrame과 JPanel을 상속받아 작성하고, JPanel의 각종 메소드를 오버라이딩해서 추가적인 기능을 쉽게 구현할 수 있다.

 

paintComponent(Graphics g)메소드

컴포넌트에 그림을 그리기 위해서는 컴포넌트가 가지고 있는 paintComponent()메소드를 오버라이딩 해야한다. 즉 자바에서 그림을 그리는 코드는 반드시 해당 메소드안에 위치해야 한다. paintComponent()메소드는 컴포넌트를 다시 그릴 필요가 있을 때마다 자바 시스템에 의하여 호출되는 메소드이다. 해당 메소드는 반드시 자동으로 호출되어야 하는데, 만약 사용자가 화면을 다시 그리고 싶다면 repain()를 호출하면 된다.

 

paintComponent()는 Graphics 타입의 매개변수를 가지고 있다. Graphics 클래스는 그림을 그리는데 필요한 모든 설정값과 그림 그리는 메소드를 가지고 있다. 자바에서 모든 그리기는 Graphics 클래스를 통해야 한다. 

 

그래픽 좌표계

자바는 아래와 같은 좌표계를 사용한다. 원점(0,0)은 왼쪽 상단이다. x좌표는 오른쪽으로 갈수록 증가하며, y좌표는 아래로 갈수록 증가한다. 모든 좌표값은 양수이며 단위는 픽셀(pixel)이다.

 

자바 좌표계

 

이미지출력

이미지 출력은 게임과 같은 애플리케이션에 아주 중요하다. 자바는 GIF, PNG, JPEG타입의 이미지를 화면에 그릴 수 있다. 이미지와 관련된 2개의 중요한 클래스가 있다.

  • java.awt.Image 클래스는 이미지를 픽셀들의 2차원 배열로 나타내는 수퍼 클래스이다.
  • java.awt.image.BufferedImage 클래스는 Image클래스를 확장한 클래스로 직접 이미지 데이터를 처리할 수 있다. 즉 픽셀을 읽거나 쓸 수 잇다. 애플리케이션은 이 클래스의 객체를 생성하는 것이 좋다. 디지털의 이미지의 경우, JPEG나 GIF형식으로 압축되어서 파일형태로 존재한다. 이들 파일을 읽어서 내부 형식의 이미지로 변환하려면 ImageIO.read()메소드를 사용해야 한다.

ex) 자동차 게임 애플리케이션 (마우스 리스너)

마우스로 자동차를 이동하는 프로그램 이다. 패널에 마우스 리스너를 추가해 익명클래스로 작성한다. (불필요한 오버라이딩을 피하기 위해서) 마우스 버튼이 눌리면 위치를 얻어서 이미지의 좌표로 저장한다.

 

실행화면

 

ex) 자동차 게임 애플리케이션 (키보드 리스너)

 

키보드의 화살표 키로 움직이는 자동차 애플리케이션 코드이다. 프레임에 패널을 붙이고 패널에 자동차를 그린다. 패널 안에서 키 이벤트를 처리해 화살표키가 입력되면 화면의 자동차를 움직인다. 여기서 주의할 점은 패널이 키 입력을 받으려면 반드시 setFocusable(true)를 호출해야 한다.

 

실행화면