javafx.scene.shape 패키지는 다양한 2D 도형을 그릴 수 있는 클래스들을 제공합니다. 하지만 여기서 제공되는 것은 선, 원, 다각형, 타원 등 기본적인(primitive) 도형에 불과합니다. 따라서 더 복잡한 사용자 지정 도형을 그리고 싶다면 Path 클래스를 사용해야 합니다.
Path 클래스란?
Path 클래스는 도형의 기하학적 윤곽선(geometrical outline)을 표현하는 클래스로, 이를 활용하면 원하는 형태의 사용자 지정 경로를 자유롭게 그릴 수 있습니다.
사용자 지정 경로를 그리기 위해 JavaFX는 다양한 경로 요소(path element)를 제공하며, 이 모든 요소는 javafx.scene.shape 패키지에서 클래스 형태로 사용할 수 있습니다.
LineTo − '직선(line)' 경로 요소를 나타내는 클래스입니다. 현재 좌표에서 지정된 새 좌표까지 직선을 그리는 데 사용됩니다.
HlineTo − '수평선(horizontal line)' 경로 요소를 나타내는 클래스입니다. 현재 좌표에서 지정된 새 좌표까지 수평선을 그립니다.
VLineTo − '수직선(vertical line)' 경로 요소를 나타내는 클래스입니다. 현재 좌표에서 지정된 새 좌표까지 수직선을 그립니다.
QuadCurveTo − '2차 곡선(quadratic curve)' 경로 요소를 나타내는 클래스입니다. 현재 좌표에서 지정된 새 좌표까지 2차 베지어 곡선을 그립니다.
CubicCurveTo − '3차 곡선(cubic curve)' 경로 요소를 나타내는 클래스입니다. 현재 좌표에서 지정된 새 좌표까지 3차 베지어 곡선을 그립니다.
ArcTo − '호(arc)' 경로 요소를 나타내는 클래스입니다. 현재 좌표에서 지정된 새 좌표까지 호를 그립니다.
MoveTo − 이 클래스를 사용하면 경로의 시작점을 현재 좌표에서 새 좌표로 이동시킬 수 있습니다.
경로 요소를 활용한 경로 만들기
Path 클래스는 현재 경로의 구성 요소들을 담고 있는 관찰 가능 리스트(observable list)를 내부적으로 포함하고 있습니다. 따라서 경로를 그리려면 아래 단계를 순서대로 따르면 됩니다.
- 필요한 PathElement 클래스들을 인스턴스화합니다.
- 각 경로 요소의 속성을 setter 메서드로 설정하거나, 생성자의 인자로 전달합니다.
- Path 클래스를 인스턴스화합니다.
- getElements() 메서드를 사용하여 앞서 생성한 Path 객체의 observable list를 가져옵니다.
- add() 또는 addAll() 메서드를 사용하여 원하는 순서대로 모든 경로 요소 객체를 observable list에 추가합니다.
- 마지막으로, 완성된 경로를 Group 객체에 추가합니다.
참고 − 경로 요소들을 Path 클래스의 생성자에 직접 전달하는 방법도 가능합니다.
예제 코드
다음 JavaFX 예제는 LineTo 경로 요소를 사용하여 별 모양의 경로를 그립니다.
import javafx.application.Application;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.scene.shape.LineTo;
import javafx.scene.shape.MoveTo;
import javafx.scene.shape.Path;
public class PathElementsExample extends Application {
public void start(Stage stage) {
//Drawing the shape
MoveTo moveTo = new MoveTo(208, 71);
LineTo line1 = new LineTo(421, 161);
LineTo line2 = new LineTo(226,232);
LineTo line3 = new LineTo(332,52);
LineTo line4 = new LineTo(369, 250);
LineTo line5 = new LineTo(208, 71);
//Creating a Path
Path path = new Path(moveTo, line1, line2, line3, line4, line5);
path.setFill(Color.DARKCYAN);
path.setStrokeWidth(8.0);
path.setStroke(Color.DARKSLATEGREY);
//Preparing the Stage object
Group root = new Group(path);
Scene scene = new Scene(root, 595, 300, Color.BEIGE);
stage.setTitle("Drawing an arc through a path");
stage.setScene(scene);
stage.show();
}
public static void main(String args[]){
launch(args);
}
}
실행 결과
