2020-11-25-TIL
2020.11.25 TIL
그림판 만들기
AWT/Swing으로 간단한 그림판을 만들 때 필요한 이벤트 처리, 그리기, 저장, 메뉴 구성을 정리한다.
마우스 이벤트: MouseListener / MouseMotionListener
마우스 입력은 두 리스너로 나뉜다. MouseListener는 클릭, 누름, 뗌, 컴포넌트 진입과 이탈(mouseClicked, mousePressed, mouseReleased, mouseEntered, mouseExited)을 받고, MouseMotionListener는 이동과 드래그(mouseMoved, mouseDragged)를 받는다. 그림판에서 선을 그리려면 mousePressed에서 시작점을 기억하고 mouseDragged가 올 때마다 직전 좌표와 현재 좌표를 잇는 식으로 구현한다. 두 인터페이스의 메서드를 모두 구현하기 번거로우면 빈 구현을 제공하는 MouseAdapter를 상속해 필요한 메서드만 오버라이드한다.
MouseEvent는 getX(), getY()로 컴포넌트 기준 좌표를, getButton()으로 눌린 버튼을 알려 준다.
- https://m.blog.naver.com/PostView.nhn?blogId=rain483&logNo=220736830546&proxyReferer=https:%2F%2Fwww.google.com%2F
선 그리기: Draw line in Java
Graphics.drawLine(x1, y1, x2, y2)가 기본이다. 다만 paint() 밖에서 getGraphics()로 바로 그리면 창을 가리거나 크기를 바꿨을 때 다시 그려지지 않고 사라진다. 그래서 그린 선들의 좌표를 리스트에 저장해 두고, paint()(Swing에서는 paintComponent())에서 저장된 선을 모두 다시 그리는 방식이 안전하다.
- https://devblog.tistory.com/entry/Java-%EC%9E%90%EB%B0%94-Graphics-%EB%A7%88%EC%9A%B0%EC%8A%A4%EB%A1%9C-%EC%84%A0%EA%B7%B8%EB%A6%AC%EA%B8%B0-%EC%86%8C%EC%8A%A4%EC%98%88%EC%A0%9C
- https://docs.oracle.com/javase/7/docs/api/java/awt/event/MouseEvent.html
Java Game Engine
AWT만으로 애니메이션이나 게임 루프를 만들면 화면 갱신, 입력, 리소스 관리를 직접 해야 한다. 링크의 질문은 Java로 RPG를 만들 때 쓸 도구를 묻는 것이고, 답변에서 언급되는 Slick2D는 LWJGL(OpenGL 바인딩) 위에서 2D 게임에 필요한 그리기, 입력, 사운드를 묶어 둔 라이브러리다. 그림판 수준에서는 AWT로 충분하지만, 프레임 단위로 화면을 다시 그리는 프로그램이라면 이런 엔진을 검토할 만하다.
- https://stackoverflow.com/questions/7563904/java-rpg-useful-tools
- http://slick.ninjacave.com/wiki/index.php?title=Main_Page
SystemColor
java.awt.SystemColor는 운영체제 GUI 요소의 색(창 배경, 메뉴, 텍스트 등)을 상징적으로 나타내는 Color의 하위 클래스다. SystemColor.window, SystemColor.menu처럼 상수로 제공되어, 그림판의 배경이나 툴바를 OS 기본 색과 맞출 때 쓴다.
- https://www.programcreek.com/java-api-examples/?api=java.awt.SystemColor
그린 내용을 이미지로 저장하기
컴포넌트와 같은 크기의 BufferedImage를 만들고, 그 이미지의 Graphics에 컴포넌트를 그리게 한 뒤(component.paint(g)), ImageIO.write(image, "png", file)로 파일에 쓴다. 화면 픽셀을 그대로 캡처하는 java.awt.Robot.createScreenCapture()도 있지만, 다른 창이 위에 겹쳐 있으면 그것까지 찍히므로 컴포넌트를 직접 그리는 쪽이 정확하다.
- https://stackoverflow.com/questions/4725320/how-to-save-window-contents-as-an-image
AWT 메뉴 바
AWT의 메뉴는 MenuBar > Menu > MenuItem 구조다. Frame.setMenuBar()로 붙이고, 각 MenuItem에 ActionListener를 달아 “저장”, “새로 그리기” 같은 동작을 연결한다. Swing에서는 같은 구조를 JMenuBar, JMenu, JMenuItem으로 쓴다.
- https://www.tutorialspoint.com/awt/awt_menubar_control.htm
VO vs DTO
두 이름은 자주 섞여 쓰이지만 목적이 다르다.
- VO(Value Object)는 값 자체로 동등성을 판단하는 작은 객체다. 마틴 파울러의 정의에 따르면 식별자가 아니라 필드 값이 같으면 같은 객체로 보며, 보통 불변으로 만든다. 돈, 좌표, 날짜 범위 같은 개념이 예다. 그래서
equals()와hashCode()를 값 기준으로 재정의한다. - DTO(Data Transfer Object)는 계층이나 프로세스 사이에 데이터를 묶어서 옮기기 위한 객체다. 원격 호출 횟수를 줄이려고 여러 값을 한 번에 담는 데서 출발했고, 로직 없이 필드와 접근자만 가지는 경우가 많다.
정리하면 VO는 도메인 개념을 값으로 표현하는 것이 목적이고, DTO는 전송이 목적이다.
- https://ijbgo.tistory.com/9
댓글
아직 댓글이 없습니다