코딩하는 애옹😸

[SWING] 스레드 / StopWatch 본문

Programming/Java

[SWING] 스레드 / StopWatch

DevYe 2019. 12. 19. 20:34
728x90

JAVA Programming

스레드를 이용하여 스탑워치를 만드는 프로그램

import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class StopWatchEx extends JFrame{
	
	JButton start, reset, pause;
	Thread p_display, t_display;
	JLabel w1, w2, w3;
	int mm, ss, ms, t=0;
	/* mm : minute 
	 * ss : second
	 * ms : millisecond 
     *		(0.01s)
	 */
	
	public StopWatchEx() {
		super("스탑워치");
		
		buildGUI();
		
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setLocation(600, 300);
		this.setVisible(true);
		this.setResizable(false);
		this.pack();
		
	}
	
	private void buildGUI() {
		JPanel p = new JPanel(new BorderLayout());
		JPanel bp = new JPanel(new FlowLayout(FlowLayout.CENTER));
		JPanel wp = new JPanel(new FlowLayout(FlowLayout.CENTER));
		
		JLabel c1 = new JLabel(" : ");	
		JLabel c2 = new JLabel(" : ");
		w1 = new JLabel("00");
		w2 = new JLabel("00");
		w3 = new JLabel("00");
		
		start = new JButton("START");
		pause = new JButton("PAUSE");
		reset = new JButton("RESET");
		bp.add(start);
		bp.add(pause);
		bp.add(reset);
		
		wp.add(w1);
		wp.add(c1);
		wp.add(w2);
		wp.add(c2);
		wp.add(w3);
		
		p.add(wp, BorderLayout.CENTER);
		p.add(bp, BorderLayout.SOUTH);
		add(p);
		
		start.setFont(new Font("serif",Font.BOLD,25));
		pause.setFont(new Font("serif",Font.BOLD,25));
		reset.setFont(new Font("serif",Font.BOLD,25));
		
		w1.setFont(new Font("courier",Font.BOLD,30));
		w2.setFont(new Font("courier",Font.BOLD,30));
		w3.setFont(new Font("courier",Font.BOLD,30));

		c1.setFont(new Font("courier",Font.BOLD,30));
		c2.setFont(new Font("courier",Font.BOLD,30));
		
		pause.setEnabled(false);
		reset.setEnabled(false);
		
		start.addActionListener(new ButtonListener());
		pause.addActionListener(new ButtonListener());
		reset.addActionListener(new ButtonListener());
	}
	
	class ButtonListener implements ActionListener{

		@Override
		public void actionPerformed(ActionEvent e) {
			String s = e.getActionCommand();
			
			if (s.equals("START")) {
				start.setEnabled(false);
				pause.setEnabled(true);
				reset.setEnabled(false);
				
				p_display = new Thread(new Runnable() {

					@Override
					public void run() {
						mm = Integer.parseInt(w1.getText());
						ss = Integer.parseInt(w2.getText());
						ms = Integer.parseInt(w3.getText());
						
						
						while (p_display == Thread.currentThread()) {	

							mm =  t % (1000*60) / 100 / 60 ;
							ss = t % (1000*60) / 100 % 60 ;
							ms = t %100;
							
							try {
								Thread.sleep(10);
								
								w1.setText(String.format("%02d", mm));
								w2.setText(String.format("%02d", ss));
								w3.setText(String.format("%02d", ms));
						
								t++;
								
							}catch (InterruptedException e1) {}
						}
					}
				});

				
				p_display.start();
				
			}
			else if (s.equals("PAUSE")) {
				start.setEnabled(true);
				pause.setEnabled(false);
				reset.setEnabled(true);
				
				p_display = null;
			}else if(s.equals("RESET")) {
				start.setEnabled(true);
				pause.setEnabled(false);
				reset.setEnabled(false);
				
				w3.setText("00");
				w2.setText("00");
				w1.setText("00");
				
				t=0;
			}
		}
	}

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

 


 

<요구사항>

- 2개의 패널로 구성 (p_display, p_button)
- 시작시 START 버튼만 활성화

[START] : 버튼이 눌리면 0.01초에 한 번씩 카운트한 결과를 화면에 표시 / 현재 상태 (중지된 마지막 시작 값) 이후로 계속 진행
[PAUSE] : 버튼이 눌리면 중지
[STOP] : 초기화

 


 

<결과물>

 

 

milisecond는 10진법이고 second는 60진법이라 계산하는데 머리가 아팠습니다 😂😂

아쉬운 점은 메인 스레드와 작업 스레드를 나눠서 구현했다면 지연없이 더 정확한 스탑워치를 만들었지 않았을까 하는 것입니다....ㅎ

 

'Programming > Java' 카테고리의 다른 글

[SWING] 성적분포표 나타내기 / 성적산출  (0) 2019.11.25
Comments