Java Swing을 사용하여 캔버스 만들기

Mehvish Ashiq 2024년2월15일
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를 재정의합니까? MouseMotionAdapterMouseMotionListener를 구현하기 때문에 익명의 내부 클래스 객체는 MouseMotionListener입니다. 익명의 내부 클래스는 기본 mouseMovedmouseDragged 구현을 상속합니다.

따라서 이미 인터페이스의 모든 메서드를 구현합니다. 그러나 기본 메서드는 호출될 때마다 아무 작업도 수행하지 않으므로 mouseDragged를 재정의하여 마우스 끌기 이벤트의 지점을 캡처하고 Point 개체로 저장합니다.

if 문은 용량이 있는 경우에만 배열에 포인트를 저장하도록 합니다. getPoint() 메소드는 이벤트가 발생한 좌표를 검색하고 pointCounter 인덱스의 points 배열에 저장한 다음 pointCounter도 증가시키기 위해 호출됩니다.

if 문을 꺼내기 전에 페인트 주기에 대한 업데이트를 처리하는 repaint() 메서드를 사용합니다. 다음으로 paintComponent 메소드는 PaintPanel이 컴퓨터 화면에 표시되어야 할 때마다 자동으로 호출되는 Graphics 매개변수를 수신합니다.

paintComponent 메소드 내에서 paintComponent의 수퍼 클래스를 명확한 그리기 영역으로 호출합니다. super 키워드를 사용하여 수퍼클래스의 메소드 및 인스턴스에 액세스한다는 것을 기억하십시오.

우리는 pointCounter까지 올라갈 수 있는 배열의 모든 점에 의해 주어진 위치에 5 x 5 타원을 그리고 fillOval() 메소드는 솔리드 타원을 그립니다.

이제 메인 클래스인 Canvas.java로 이동합니다. JFramePaintPanel의 개체를 만듭니다.

그런 다음 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);
  }
}

출력:

자바 스윙을 사용하여 캔버스 만들기 - 프로그래밍 방식으로 캔버스에 그리기

Mehvish Ashiq avatar Mehvish Ashiq avatar

Mehvish Ashiq is a former Java Programmer and a Data Science enthusiast who leverages her expertise to help others to learn and grow by creating interesting, useful, and reader-friendly content in Computer Programming, Data Science, and Technology.

LinkedIn GitHub Facebook

관련 문장 - Java Swing