컴퓨터공학 💻 도서관📚
자바 스윙 GUI 로 만든 타이머 프로그램 본문
[ 수정 후 ]

[ 수정 전 ]

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
