[java] JavaFX 시계 및 타이머 구현하기

이번 포스트에서는 JavaFX를 사용하여 시계와 타이머를 구현하는 방법을 알아보겠습니다.

1. JavaFX 프로젝트 설정하기

먼저, JavaFX 프로젝트를 설정해야 합니다. Java 11 이상 버전을 사용하는 경우, JavaFX는 JDK에 기본으로 포함되어 있지 않으므로 별도로 추가해야 합니다. 이를 위해 JavaFX 다운로드 페이지에서 JavaFX SDK를 다운로드하고 압축을 해제합니다.

다음으로 IntelliJ IDEA에서 JavaFX 프로젝트를 설정하는 방법을 알아보겠습니다. 먼저, 새로운 프로젝트를 생성한 후 프로젝트 디렉토리에서 File > Project Structure 메뉴로 이동합니다. 이후, Project Settings 아래의 Libraries를 선택하고 + 버튼을 클릭하여 JavaFX SDK 디렉토리를 추가합니다.

2. 시계 구현하기

시계를 구현하는 방법은 매우 간단합니다. 텍스트로 된 레이블을 생성한 후, Timeline을 사용하여 매 초마다 현재 시간을 업데이트합니다.

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;

public class ClockApp extends Application {
    public void start(Stage stage) {
        Label clockLabel = new Label();

        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("HH:mm:ss");
        Timeline timeline = new Timeline(
                new KeyFrame(Duration.ZERO, e -> {
                    LocalTime currentTime = LocalTime.now();
                    String formattedTime = currentTime.format(formatter);
                    clockLabel.setText(formattedTime);
                }),
                new KeyFrame(Duration.seconds(1))
        );
        timeline.setCycleCount(Animation.INDEFINITE);
        timeline.play();

        VBox root = new VBox(clockLabel);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("시계");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

위의 코드에서는 ClockApp 클래스가 Application 클래스를 확장하고 start 메소드에서 UI 구성을 합니다. Timeline 객체를 사용하여 1초마다 현재 시간을 업데이트하는 로직을 구현하고, 이를 시계 레이블에 표시합니다.

3. 타이머 구현하기

타이머를 구현하는 방법도 간단합니다. 사용자가 입력한 시간으로부터 타이머를 시작하고, 남은 시간을 매 초마다 업데이트합니다.

import javafx.animation.Animation;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class TimerApp extends Application {
    private int remainingSeconds = 0;

    public void start(Stage stage) {
        Label timerLabel = new Label();

        Button startButton = new Button("Start");
        startButton.setOnAction(e -> {
            remainingSeconds = 60; // 1분
            Timeline timeline = new Timeline(
                    new KeyFrame(Duration.ZERO, evt -> {
                        if (remainingSeconds > 0) {
                            remainingSeconds--;
                            timerLabel.setText(String.valueOf(remainingSeconds));
                        } else {
                            // 타이머 종료
                        }
                    }),
                    new KeyFrame(Duration.seconds(1))
            );
            timeline.setCycleCount(Animation.INDEFINITE);
            timeline.play();
        });

        VBox root = new VBox(timerLabel, startButton);
        Scene scene = new Scene(root);
        stage.setScene(scene);
        stage.setTitle("타이머");
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}

위의 코드에서는 TimerApp 클래스가 Application 클래스를 확장하고 start 메소드에서 UI를 구성합니다. 시작 버튼을 클릭하면 타이머가 시작되며, 매 초마다 남은 시간을 업데이트하여 표시합니다.

결론

이번 포스트에서는 JavaFX를 사용하여 시계와 타이머를 간단하게 구현하는 방법을 알아보았습니다. JavaFX의 다양한 기능을 활용하여 좀 더 다양하고 복잡한 시계 및 타이머를 구현할 수도 있습니다. JavaFX를 사용하여 UI 요소를 만들고 제어하는 방법을 익힌 후, 원하는 시계 및 타이머를 구현해 보세요!

[참고 자료]