코딩/JAVA

Thread 타이머

ADWELL 2022. 9. 16. 15:29

import java.awt.*;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class ThreadTest4 {
	public static void main(String[] args) {
		new ThreadTimerEx();
	}
}

class ThreadTimerEx extends JFrame{
	
	private static final long serialVersionUID = 1L;
	
	JButton btn_Start, btn_Stop, btn_Clear;
	JLabel timerLabel;
	boolean run_chk = false;
	
	public ThreadTimerEx() {
		setTitle("스레드 타이머");
		setBounds(50,50,300,300);
		
		JPanel panel = new JPanel();
		panel.setLayout(null);
		
		timerLabel = new JLabel("000");
		timerLabel.setFont(new Font("Gothic", Font.ITALIC, 80));
		timerLabel.setBounds(10, 10, 265, 200);
		timerLabel.setHorizontalAlignment(JLabel.CENTER);
		timerLabel.setBackground(Color.YELLOW);
		timerLabel.setOpaque(true);
		panel.add(timerLabel);
		
		btn_Start = new JButton("START");
		btn_Stop = new JButton("STOP");
		btn_Clear = new JButton("CLEAR");
		
		BtnEvent btnEvent = new BtnEvent();
		btn_Start.addActionListener(btnEvent);
		btn_Stop.addActionListener(btnEvent);
		btn_Clear.addActionListener(btnEvent);
		
		JPanel btnPanel = new JPanel(new GridLayout(1,3));
		btnPanel.setBounds(10, 215, 265, 40);
		
		btnPanel.add(btn_Start);
		btnPanel.add(btn_Stop);
		btnPanel.add(btn_Clear);
		
		panel.add(btnPanel);
		
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setVisible(true);
		add(panel);

	} 
	private class BtnEvent implements ActionListener{

		int cnt = 0;
		
		@Override
		public void actionPerformed(ActionEvent e) {
			JButton button = (JButton)e.getSource();

			if(button == btn_Start) {
				if(run_chk)	return;
				
				run_chk = true;
				
				new Thread(new Runnable() {
					@Override
					public void run() {
						while(run_chk) {
							timerLabel.setText(String.format("%03d", cnt));
							cnt++;
							try {
								Thread.sleep(1000);
							} catch (InterruptedException e) {
								e.printStackTrace();
							}
						}
					}
				}).start();
				
			}else if(button == btn_Stop) {
				run_chk = false;
			}else if(button == btn_Clear) {
				run_chk = false;
				cnt = 0;
				timerLabel.setText(String.format("%03d", cnt));
			}
		}
		
	}
}