Notice
Recent Posts
Recent Comments
Link
반응형
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | ||||||
| 2 | 3 | 4 | 5 | 6 | 7 | 8 |
| 9 | 10 | 11 | 12 | 13 | 14 | 15 |
| 16 | 17 | 18 | 19 | 20 | 21 | 22 |
| 23 | 24 | 25 | 26 | 27 | 28 | 29 |
| 30 |
Tags
- backpropagation
- RNN
- java
- github branch
- Git
- homebrew설치
- 파이썬
- 쉽게배우는운영체제
- 운영체제연습문제
- 딥러닝
- CNN
- GitHub
- MAC OS
- ann
- 정보처리기사
- 자바
- ai개발밋업
- 판교퇴근길밋업
- Python
- 2020정보처리기사
- 부스트캠프 AI Tech
- 우분투리눅스
- 리눅스연습문제
- Swing
- 운영체제
- 리눅스7장
- Django
- BPTT
- AIStages
- repository 복구
Archives
- Today
- Total
코딩하는 애옹😸
[SWING] 스레드 / StopWatch 본문
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