컴퓨터공학 💻 도서관📚

자바 스윙 GUI 로 만든 타이머 프로그램 본문

💻📚프로젝트 일기장/신입 개발자 데뷔하기

자바 스윙 GUI 로 만든 타이머 프로그램

들판속초록풀 2026. 1. 2. 14:17

[ 수정 후 ]

 

 

[ 수정 전 ]

 

 

package tmp;
import javax.swing.*;
import java.awt.*;
import java.util.concurrent.*;

public class TimerAlertApp extends JFrame {

    private JTextField timeField;
    private JButton startButton;
    private JLabel remainingTimeLabel;

    private ScheduledExecutorService scheduler;  // ScheduledExecutorService 는 인터페이스다
    private int remainingSeconds;

    public TimerAlertApp() {
        setTitle("시간 알림 프로그램");
        setSize(350, 200);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLayout(new BorderLayout(0,50));

        JPanel panel = new JPanel(new GridLayout(2, 2));
        panel.add(new JLabel("총 시간 (분):"));
        timeField = new JTextField();
        panel.add(timeField);

        startButton = new JButton("시작");
        panel.add(new JLabel());
        panel.add(startButton);

        add(panel, BorderLayout.CENTER);

        remainingTimeLabel = new JLabel("남은 시간: --:--:--", SwingConstants.CENTER);

        Font baseFont = remainingTimeLabel.getFont();                   
        remainingTimeLabel.setFont(baseFont.deriveFont(Font.BOLD, 30f)); // 글자 크기 설정(30f)

        remainingTimeLabel.setPreferredSize(new Dimension(0, 50));     // 사이즈 조절
        add(remainingTimeLabel, BorderLayout.SOUTH);

        startButton.addActionListener(e -> startTimer());
    }

    private void startTimer() {
        int totalMinutes;

        try {
            totalMinutes = Integer.parseInt(timeField.getText());  // Wrapper 클래스, pareInt 메서드
        } catch (NumberFormatException e) {                              // 예외처리
            JOptionPane.showMessageDialog(this, "숫자를 입력하세요!");
            return;
        }

        if (scheduler != null && !scheduler.isShutdown()) {
            scheduler.shutdownNow();
        }

        scheduler = Executors.newSingleThreadScheduledExecutor();        // 생성자로 선언

        remainingSeconds = totalMinutes * 60;

        // 🔹 1초마다 남은 시간 업데이트
        scheduler.scheduleAtFixedRate(() -> {
            remainingSeconds--;

            if (remainingSeconds < 0) {
                scheduler.shutdown();
                return;
            }

            int hours = remainingSeconds / 3600;
            int minutes = (remainingSeconds % 3600) / 60;
            int seconds = remainingSeconds % 60;

            SwingUtilities.invokeLater(() ->
                    remainingTimeLabel.setText(
                            String.format("남은 시간: %d시간 %02d분 %02d초", hours, minutes, seconds)
                    )
            );
        }, 1, 1, TimeUnit.SECONDS);

        scheduleAlert(totalMinutes - 30, "30분 남았습니다!");
        scheduleAlert(totalMinutes - 10, "10분 남았습니다!");
        scheduleAlert(totalMinutes, "시간 종료!");

        JOptionPane.showMessageDialog(this, "타이머 시작!");
    }

    private void scheduleAlert(int minutesLater, String message) {
        if (minutesLater <= 0) return;

        scheduler.schedule(() ->
                        SwingUtilities.invokeLater(() ->
                                JOptionPane.showMessageDialog(this, message)
                        ),
                minutesLater, TimeUnit.MINUTES
        );
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> {
            TimerAlertApp app = new TimerAlertApp();
            app.setVisible(true);
        });
    }
}

 

 

 

 

 

 

 

 

Comments