JavaFX | 셰이프(Shape)을 사용한 벡터 그래픽 | Java 소스 코드로 셰이프 사용

FXML를 사용하지 않고, Java 소스 코드에서 직접 모양의 개체를 만들고, 스테이지에 설정 표시 할 수 있다. 실제로 해보록 하자.

아래에 샘플은 아와 같다.

package com.devkuma.javafx;
     
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.*;
import javafx.stage.Stage;
 
public class App extends Application {
     
    public static void main(String[] args) {
        launch(args);
    }
 
    @Override
    public void start(Stage stage) {
        Pane root = new Pane();
        createShape(root);
        Scene scene = new Scene(root,300,300);
        stage.setScene(scene);
        stage.show();
    }
     
    public void createShape(Pane root){
        Rectangle r = new Rectangle(50, 50, 100, 100);
        r.setFill(Color.RED);
        r.setStroke(Color.BLUE);
        r.setStrokeWidth(3);
        root.getChildren().add(r);
        Circle c = new Circle(150, 150, 50);
        c.setFill(Color.YELLOW);
        c.setStroke(Color.GREEN);
        c.setStrokeWidth(10);
        root.getChildren().add(c);
    }
}

여기에서는 createShape라는 메소드를 사용하고, 그 속에서 사각형과 원형 모양을 그릴 수 있다. 먼저 FXML로 만든 샘플과 같은 것이기 때문에, 양자를 비교해 보면 차이를 잘 알 수 있다.

인스턴스 만들기

모양의 클래스는 Rectangle와 Circle 모두 FXML 태그와 같은 이름이다. 인스턴스의 생성은 모두 필수 속성을 인수로 지정하는 형태로 되어 있다.

new Rectangle(가로 위치, 세로 위치, 폭, 높이)
new Circle(중심 가로 위치, 중심 세로 위치, 반경)

이 클래스에는 인수가 없는 디폴트 생성자에서 여러 종류의 생성자가 존재하며, 다양한 방식으로 인스턴스를 생성할 수 있다. 필수 항목이 되는 속성의 값을 모두 인수로 넣은 모양이 가장 잘 알기 쉽다.

속성 설정

작성 후, fill, stroke, strokeWidth의 속성을 설정하는 메소드를 호출한다. Rectangle라면 다음과 같다.

r.setFill (Color.RED);
r.setStroke (Color.BLUE);
r.setStrokeWidth (3);

FXML 태그에 포함되어 있던 속성은 “set 속성 이름"라는 메소드로 값을 설정할 수 있다. 또한 이번에는 사용하지 않았지만 “get 속성 이름” 또는 “is 속성 이름"라는 메소드로 값을 얻을 수 있다.

색상 값에 대해

이번 setFill과 setStroke에서는 Color 클래스의 필드를 지정하고 있다. 이들은 먼저 Canvas에서 이용을 하였다. 채우기 및 선 색상을 Color로 설정하는 등 기본적인 아이디어는 Canvas 그리기와 거의 같은 것이다.