텍사스 대학교 코드 샘플을 분석하고 있었지만 KDT 풀스택 과정에서 Java 개인 프로젝트를 받았다.
대강 해결했지만 더 재밌게 구현해보고 싶어서 Java 의 GUI 를 찾아보고 있던 중에 JavaFx 를 발견했다. 재밌어보여서 좀 건드려보려고 한다. 요즘 재밌는 게 너무 많아서 우선순위를 고르는 게 걱정이다.

https://gluonhq.com/products/javafx/
다운로드는 위 링크에서 받았다. 요즘 Java GUI 중에서는 JavaFx 가 괜찮은 편이라는데 그런 주제에 JDK 에서 기본지원을 안 한다는 게 이상하다.
Swing 이라는 GUI 는 JDK 에 들어있다는데 한국어로 검색해봐도 영어로 검색해봐도 평이 별로 안 좋다. 그냥 귀찮아서 기본지원되는 Swing 을 쓰고 싶기도 하지만 일단 JavaFx 를 시도해보니 되기는 하길래 그냥 JavaFx 를 하려고 한다.
아니 왜 평이 좋고 오라클에서 밀어준다면서 jdk 에는 왜 안 들어있는거지?
https://docs.oracle.com/javafx/2/get_started/jfxpub-get_started.htm

어쨌든 오라클에서 공식 튜토리얼을 지원하는 것처럼 생긴 페이지도 있다.
그 중에서 첫번째 Hello World 를 확인해봤다.
https://docs.oracle.com/javafx/2/get_started/hello_world.htm
들어가보면 이렇게 생긴 코드가 있다.
//Example 1-1 Hello World
package helloworld;
 
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
 
public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello World!");
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
 
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello World!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}
따라쳐봤다. 정확히 따라친 건 아니고 그냥 치면서 내키는 대로 String 에 어레인지도 넣고 하면서 옮겨적었다.
package practice;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class HelloWorld extends Application {
    public static void main(String[] args) {
        launch(args);
    }
    
    @Override
    public void start(Stage primaryStage) {
        primaryStage.setTitle("Hello JavaFx!");
        Button btn = new Button();
        btn.setText("Say 'Hey JavaFx'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
        //velog <pre> 에서는 <ActionEvent>() 가 자동으로 지워져서. ```java 로 바꿨다.
            @Override
            public void handle(ActionEvent event) {
                System.out.println("Hello JavaFx!!");
            }
        });
        
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}
그리고 내 친구 cmd 를 킨다. 시행착오를 겪었지만 어쨌든 구동시키는 명령어를 알아냈다.
다운 받은 JavaFx 에서 javafx-sdk-21.0.1 폴더를 뽑아다가 현재 cmd 로 탐색하는 경로로 옮겼다고 할 때,
그리고 현재 HelloWorld.java 파일이 그 cmd 경로에 있는 폴더 practice 를 package 로 두고 있다고 하면,
javac --module-path javafx-sdk-21.0.1\lib --add-modules javafx.controls,javafx.fxml practice\HelloWorld.java
로 컴파일을 하고,
java --module-path javafx-sdk-21.0.1\lib --add-modules javafx.controls,javafx.fxml practice.HelloWorld
로 jvm 을 통해 실행시킬 수 있다.
결과물은 다음과 같다.

가운데 있는 "Say 'Hey JavaFx'" 버튼을 누를 때마다 콘솔창에 "Hello JavaFx!!" 가 출력된다.
"Hello JavaFx!"라는 이름을 가진 window 를 구현하는데 성공했으니 일단 실행확인은 했다고 볼 수 있다.
이번 주말까지 이걸 어느정도 이해해서 내 개인 프로젝트에 장난칠 수 있을 정도로 익숙해졌으면 좋겠다. 과제 제출때까지 남은 시간은 얼마 되지 않는다.