본문 바로가기

<자바> 스레드 시계 - Thread Clock

 

 

오늘은 <자바>에서 Thread를 배웠다면,

한 번쯤은 만들어봤을 법한 스레드를

이용한 시계를 만들어보겠습니다.

 

 

우선 제가 만들 스레드 시계는

기본적으로 시계가 있고 추가적으로 버튼을

누름으로써 오늘 날짜가 보이는 시계로

생각을 하고 코드를 만들었습니다.

 

 

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
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.event.MouseAdapter;
import java.io.IOException;
import java.util.Calendar;
 
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPan
 
public class ThreadClock extends JFrame{
    
    private boolean aa = true;
    
    private Thread t1;
    
    private JLabel lblNorth;
    private JLabel lblCenter;
    private JLabel lblSouth;
    
    private JButton btnDay;
    private JButton btnTime;
    
    Font font;
    Color color = (Color.WHITE);
    
    
    // 메인이 시계 메소드
    // 
    public void ThreadTime() {
        
         t1 = new Thread() {
            public void run() {
                
                while(aa)
                Calendar cal = Calendar.getInstance();
                    
                    // String으로 객체를 생성하는것보다
                    // 메모리를 더 효율적으로 사용하기 위해서 StirngBuffer 사용
                    
                    StringBuffer now = new StringBuffer();
                    
                    now.append(cal.get(Calendar.HOUR_OF_DAY));
                    now.append("시");
                    now.append(cal.get(Calendar.MINUTE));                    
                    now.append("분");
                    now.append(cal.get(Calendar.SECOND));
                    now.append("초");
                    
                    lblNorth.setText("<<현재 시간>>");
                    
                    lblCenter.setText(now.toString());
                
                try {
                    
                        Thread.sleep(1000);
                        
                } catch(InterruptedException ie) {
                    
                    ie.printStackTrace();
                
                    aa = false;
                    
                }
            }
                
            }
        };
        t1.start();
    }
    
    public ThreadClock() {
        
        font = new Font("맑은 고딕",Font.BOLD,28);
        
        lblNorth = new JLabel("",JLabel.CENTER);
        lblSouth = new JLabel("이른 아침은 입에 황금을 물고 있다.",JLabel.CENTER);
        
        btnDay = new JButton("날짜");
        btnTime = new JButton("시간");
        
        lblNorth.setFont(new Font("맑은 고딕", Font.BOLD, 16));
        
        // 시계 정보를 담을 JLabel
        lblCenter = new JLabel("",JLabel.CENTER);
        lblCenter.setFont(font);
        
        lblNorth.setOpaque(true); 
        lblNorth.setBackground(color);
        
        lblCenter.setOpaque(true); 
        lblCenter.setBackground(color);
        
        btnDay.setBackground(color);
        btnTime.setBackground(color);
        
        JPanel pnlInSouth = new JPanel();
        pnlInSouth.add(lblSouth);
        pnlInSouth.setBackground(color);
        
        JPanel pnlbtn = new JPanel();
        pnlbtn.add(btnTime);
        pnlbtn.add(btnDay);
        pnlbtn.setBackground(color);
        
        JPanel pnlSouth = new JPanel(new BorderLayout());
        pnlSouth.add(pnlInSouth, BorderLayout.CENTER);
        pnlSouth.add(pnlbtn, BorderLayout.SOUTH);
        pnlSouth.setBackground(color);
        
        JPanel pnlMain = new JPanel(new BorderLayout());
        pnlMain.add(lblNorth,BorderLayout.NORTH);
        pnlMain.add(lblCenter, BorderLayout.CENTER);
        pnlMain.add(pnlSouth, BorderLayout.SOUTH);
        
        add(pnlMain);
        
        // 실행과 동시에 메소드로 지정한 스레드 시작
        ThreadTime();
        
        btnDay.addActionListener((e)->{
            
            t1.interrupt();
            
            Calendar cal = Calendar.getInstance();
            
            StringBuffer now = new StringBuffer();
            now.append(cal.get(Calendar.YEAR));
            now.append("년");
            now.append((cal.get(Calendar.MONTH) + 1));
            now.append("월");
            now.append(cal.get(Calendar.DATE));
            now.append("일");
            
            lblNorth.setText("<<오늘 날짜>>");
            lblCenter.setText(now.toString());
            
        });
        
        btnTime.addActionListener((e)->{
            
            // 여기서 boolean 값을 true로 바꾸지 않으면
            // 스레드안의 while문이 작동하지 않아서 시계가 안돌아감
            aa = true;
            
            ThreadTime();
            
        });
        
        setTitle("Timer");
        setSize(400,250);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setVisible(true);
        
    }
    
    public static void main(String[] args) {
        
        JFrame.setDefaultLookAndFeelDecorated(true);
        new ThreadClock();
        
    }
}
 
 
 
cs

 

 

위의 코드를 실행하면!?

 

 

 

 

이런 식으로 기본적으로 메인 클래스 안에

Thread 메소드가 실행되면서 시계가 보이고,

추가적으로 날짜 버튼을 누르면

오늘 날짜를 들고 오는 걸로 만들었습니다.

 

 

참고로 시계를 멈추기 위해서

Thread 메소드를 보시면 aa라는

boolena 변수를 생성해서 넣어주었습니다.

 

 

메인 클래스에 Thread의 상속이나 인터페이스

사용하지 않기 위해서 Thread를 변수로 생성해서,

간단하게 사용했습니다.

 

 

소스코드는 아래에 첨부하겠습니다.

궁금한 점은 댓글 달아주시면

바로 답변해드리겠습니다.

 

 

ThreadClock.java
0.00MB

 

93 DL

Develop Life