Java Swing을 사용하여 캔버스 만들기
Java에서는 Java AWT 또는 Java Swing을 사용하여 두 가지 방법으로 캔버스를 만들 수 있습니다. 오늘은 Java Swing을 사용하여 캔버스를 만들고 모양을 그리는 방법을 배웁니다.
Java Swing을 사용하여 캔버스 생성
예제 코드(PaintPanel.java
클래스):
// write your package here
package com.voidtesting.canvas;
// import necessary libraries
import java.awt.Graphics;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import javax.swing.JPanel;
public class PaintPanel extends JPanel {
// count the number of points
private int pointCounter = 0;
// array of 10000 Point references
private Point[] points = new Point[10000];
// make GUI and register the mouse event handler
public PaintPanel() {
// handles frame mouse motion event
addMouseMotionListener(new MouseMotionAdapter() {
// store the drag coordinates and repaint
@Override
public void mouseDragged(MouseEvent event) {
if (pointCounter < points.length) {
// find points
points[pointCounter] = event.getPoint();
// increment point's number in the array
++pointCounter;
// repaint JFrame
repaint();
} // end if
} // end mouseDragged method
} // end anonymous inner class
); // end call to the addMouseMotionListener
} // end PaintPanel constructor
/*
draw oval in a 5 by 5 bounding box at the given location
on the window
*/
@Override
public void paintComponent(Graphics g) {
// clear drawing area
super.paintComponent(g);
// draw all points that we have in array
for (int i = 0; i < pointCounter; i++) g.fillOval(points[i].x, points[i].y, 5, 5);
} // end paintComponent method
} // end PaintPanel Class
예제 코드(Canvas.java
클래스):
// write your package here
package com.voidtesting.canvas;
// import necessary libraries
import java.awt.BorderLayout;
import java.awt.Label;
import javax.swing.JFrame;
public class Canvas {
public static void main(String[] args) {
// create JFrame Object
JFrame jFrame = new JFrame("Canvas Using Java Swing");
// create PaintPanel Object
PaintPanel paintPanel = new PaintPanel();
// add paintPanel in center
jFrame.add(paintPanel, BorderLayout.CENTER);
// place the created label in the south of BorderLayout
jFrame.add(new Label("Drag the mouse to draw"), BorderLayout.SOUTH);
// exit on close
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// set frame size
jFrame.setSize(500, 400);
// set jFrame location to center of the screen
jFrame.setLocationRelativeTo(null);
// display frame
jFrame.setVisible(true);
}
}
출력:
PaintPanet.java
클래스에서 JPanel
을 확장
하여 그리기를 위한 커밋된 영역을 만듭니다. Point
클래스는 x 및 y 좌표를 나타냅니다.
모든 마우스 드래그 이벤트의 모든 좌표를 저장하기 위해 Point
클래스의 객체를 생성하는 반면 Graphics
클래스는 그리기에 사용됩니다. 이 예에서는 모든 마우스 끌기 이벤트가 발생하는 위치를 저장하는 10,000개의 점/좌표를 포함하는 Point
유형의 배열을 사용합니다.
paintComponent
가 이 좌표를 사용하여 그리는 것을 볼 수 있습니다. pointCounter
라는 인스턴스 변수는 여전히 마우스 드래그 이벤트를 통해 캡처된 총 포인트 수를 추적합니다.
10,000 한도에 도달하자마자 더 이상 그릴 수 없습니다.
그런 다음 PaintPanel
클래스의 마우스 모션 이벤트를 수신할 수 있는 MouseMotionListener
를 등록합니다. addMouseMotionListener()
리스너 내에서 MouseMotionAdapter
라는 어댑터 클래스를 확장하는 익명 내부 클래스의 개체를 만듭니다.
왜 mouseDragged
를 재정의합니까? MouseMotionAdapter
는 MouseMotionListener
를 구현하기 때문에 익명의 내부 클래스 객체는 MouseMotionListener
입니다. 익명의 내부 클래스는 기본 mouseMoved
및 mouseDragged
구현을 상속합니다.
따라서 이미 인터페이스의 모든 메서드를 구현합니다. 그러나 기본 메서드는 호출될 때마다 아무 작업도 수행하지 않으므로 mouseDragged
를 재정의하여 마우스 끌기 이벤트의 지점을 캡처하고 Point
개체로 저장합니다.
if
문은 용량이 있는 경우에만 배열에 포인트를 저장하도록 합니다. getPoint()
메소드는 이벤트가 발생한 좌표를 검색하고 pointCounter
인덱스의 points
배열에 저장한 다음 pointCounter
도 증가시키기 위해 호출됩니다.
if
문을 꺼내기 전에 페인트 주기에 대한 업데이트를 처리하는 repaint()
메서드를 사용합니다. 다음으로 paintComponent
메소드는 PaintPanel
이 컴퓨터 화면에 표시되어야 할 때마다 자동으로 호출되는 Graphics
매개변수를 수신합니다.
paintComponent
메소드 내에서 paintComponent
의 수퍼 클래스를 명확한 그리기 영역으로 호출합니다. super
키워드를 사용하여 수퍼클래스의 메소드 및 인스턴스에 액세스한다는 것을 기억하십시오.
우리는 pointCounter
까지 올라갈 수 있는 배열의 모든 점에 의해 주어진 위치에 5 x 5
타원을 그리고 fillOval()
메소드는 솔리드 타원을 그립니다.
이제 메인 클래스인 Canvas.java
로 이동합니다. JFrame
및 PaintPanel
의 개체를 만듭니다.
그런 다음 add()
메서드를 사용하여 JFrame
창의 중앙에 PaintPanel
의 개체를 추가합니다. BorderLayout.CENTER
를 사용하여 JFrame
창의 중앙에 추가합니다.
다음으로 BorderLayout.SOUTH
를 사용하여 JFrame
창의 남쪽에 Label
을 추가합니다. 그런 다음 setDefaultCloseOperation()
, setSize()
, setLocationRelativeTo()
및 setVisible()
메서드를 사용하여 사용자가 십자 기호(X
)를 클릭할 때 창을 닫고 설정 JFrame
창의 크기를 조정하려면 JFrame
창을 컴퓨터 화면 중앙으로 이동하여 각각 표시합니다.
캔버스에 수동으로 그리는 대신 프로그래밍 방식으로 그릴 수 있습니다.
예제 코드(Draw.java
클래스에는 main
메소드가 있음):
// write your package here
package com.voidtesting.canvas.draw;
// import necessary libraries
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class Draw extends JPanel {
@Override
public void paintComponent(Graphics g) {
// call method of the super class
super.paintComponent(g);
// set background color
this.setBackground(Color.cyan);
// set color of the shape
g.setColor(Color.red);
// draw line
g.drawLine(5, 30, 380, 30);
// set color of the shape
g.setColor(Color.blue);
// draw rectangular
g.drawRect(5, 40, 90, 55);
// set color of the shape
g.setColor(Color.BLACK);
// draw string
g.drawString("Hi, how are you?", 100, 50);
// set color of the shape
g.setColor(Color.green);
// draw filled rectangular
g.fill3DRect(5, 100, 90, 55, true);
// draw filled oval
g.fillOval(150, 100, 90, 55);
}
public static void main(String[] args) {
// create JFrame Object
JFrame jFrame = new JFrame("Canvas");
// add the object of Draw Class in center
jFrame.add(new Draw(), BorderLayout.CENTER);
// exit on close
jFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// set frame size
jFrame.setSize(300, 200);
// set jFrame location to center of the screen
jFrame.setLocationRelativeTo(null);
// display frame
jFrame.setVisible(true);
}
}
출력: