[버튼입력받아 계산기 만들기]
더보기
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
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
|
package site.itwill.swing;
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Container;
import java.awt.Font;
import java.awt.GridLayout;
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.JOptionPane;
import javax.swing.JPanel;
//단순 사칙 연산식을 입력받아 연산 결과를 출력하는 프로그램
//디자인 겸, 이벤트 핸들러 클래스
public class CalculatorFrameApp2 extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
//연산식을 입력하기 위한 필드(컴퍼넌트)
private JButton b_0, b_1, b_2, b_3, b_4, b_5, b_6, b_7, b_8, b_9, b_equals, b_plus,
b_minus, b_multi, b_div, b_C;
//연산 결과를 출력하기 위한 필드(컴퍼넌트)
private JLabel label;
//연산식을 저장하기위한 필드
private String operation = ""; //연산식의 값을 계속 가지고 다녀야하므로 필드로 만들어주기!
public CalculatorFrameApp2(String title) {
super(title);
initButtons();
init();
}
private void init() {
label = new JLabel("0");
label.setFont(new Font("DIALOG", Font.BOLD, 30));
label.setHorizontalAlignment(JLabel.RIGHT);
label.setBackground(Color.LIGHT_GRAY);
label.setForeground(Color.WHITE);
JPanel p = new JPanel(new GridLayout(4, 4, 5, 5));
p.setBackground(Color.BLACK);
p.add(b_multi);
p.add(b_div);
p.add(b_plus);
p.add(b_minus);
p.add(b_1);
p.add(b_2);
p.add(b_3);
p.add(b_4);
p.add(b_5);
p.add(b_6);
p.add(b_7);
p.add(b_8);
p.add(b_9);
p.add(b_0);
p.add(b_equals);
p.add(b_C);
Container container=getContentPane();
container.setLayout(new BorderLayout(10, 10));
container.setBackground(Color.BLACK);
container.add(label, BorderLayout.NORTH);
container.add(p, BorderLayout.CENTER);
b_0.addActionListener(this);
b_1.addActionListener(this);
b_2.addActionListener(this);
b_3.addActionListener(this);
b_4.addActionListener(this);
b_5.addActionListener(this);
b_6.addActionListener(this);
b_7.addActionListener(this);
b_8.addActionListener(this);
b_9.addActionListener(this);
b_div.addActionListener(this);
b_plus.addActionListener(this);
b_minus.addActionListener(this);
b_multi.addActionListener(this);
b_C.addActionListener(this);
b_equals.addActionListener(this);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setResizable(false);
setBounds(500, 100, 400, 400);
setVisible(true);
}
private void initButtons() {
b_0 = new JButton("0");
b_1 = new JButton("1");
b_2 = new JButton("2");
b_3 = new JButton("3");
b_4 = new JButton("4");
b_5 = new JButton("5");
b_6 = new JButton("6");
b_7 = new JButton("7");
b_8 = new JButton("8");
b_9 = new JButton("9");
b_equals = new JButton("=");
b_plus = new JButton("+");
b_minus = new JButton("-");
b_multi = new JButton("*");
b_div = new JButton("/");
b_C = new JButton("C");
b_0.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_1.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_2.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_3.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_4.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_5.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_6.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_7.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_8.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_9.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_div.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_plus.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_minus.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_multi.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_C.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_equals.setFont(new Font("DIALOG", Font.PLAIN, 20));
b_0.setBackground(Color.WHITE);
b_1.setBackground(Color.WHITE);
b_2.setBackground(Color.WHITE);
b_3.setBackground(Color.WHITE);
b_4.setBackground(Color.WHITE);
b_5.setBackground(Color.WHITE);
b_6.setBackground(Color.WHITE);
b_7.setBackground(Color.WHITE);
b_8.setBackground(Color.WHITE);
b_9.setBackground(Color.WHITE);
b_div.setBackground(Color.YELLOW);
b_plus.setBackground(Color.YELLOW);
b_minus.setBackground(Color.YELLOW);
b_multi.setBackground(Color.YELLOW);
b_C.setBackground(Color.GREEN);
b_equals.setBackground(Color.CYAN);
}
public static void main(String[] args) {
new CalculatorFrameApp2("계산기");
}
@Override
public void actionPerformed(ActionEvent e) {//버튼을 누르면 무조건 발생하는 메소드
//그러므로 이벤트 소스를 구분해야 한다.
Object button = e.getSource();
if(button == b_C) {//연산식 저장필드 초기화
operation = "";
//출력컴포넌트도 초기화
label.setText("0");
}else if(button == b_equals) {
//필드에 저장된 연산식에서 연산자를 검색하여 위치값을 반환받아 저장
String[] oper = { "*", "/", "+", "-" };
int index = -1;
for(String temp : oper) {
index =operation.lastIndexOf(temp);
if(index != -1) break; //연산자가 있다면 for문 나와라
}
if(index == -1) return;//연산자가 없는 경우 이벤트 처리 메소드 종료
try{
int num1 = Integer.parseInt(operation.substring(0,index));
int num2 = Integer.parseInt(operation.substring(index+1));
String operater = operation.substring(index, index+1);
int result = 0;
switch(operater) {
case "+" :
result = num1 + num2;
break;
case "-" :
result = num1 - num2;
break;
case "*":
result = num1 * num2;
case "/" :
result = num1 / num2;
break;
}
label.setText(result + "");
operation = result + "";
}catch(NumberFormatException exception){
operation = "";
label.setText("0");
//JOptionPane.showMessageDialog : 메세지출력 다이얼로그를 출력하는 메소드
JOptionPane.showMessageDialog(this, "입력형식이 연산식에 맞지 않아요", "에러", JOptionPane.ERROR_MESSAGE);
}catch (ArithmeticException e2) {
operation = "";
label.setText("0");
JOptionPane.showMessageDialog(this, "0으로 나눌 수 없어요", "에러", JOptionPane.ERROR_MESSAGE);
}catch (Exception e2) {
operation = "";
label.setText("0");
JOptionPane.showMessageDialog(this, "예기치 못한 에러가 났어요", "에러", JOptionPane.ERROR_MESSAGE);
System.exit(0);
}
}else {//연산식 관련 버튼을 누른경우
operation += ((JButton) button).getText();//이벤트 발생버튼의 문자열을 얻어와 연산식 저장필드에 추가!!
//출력컴퍼넌트의 문자열을 저장필드값으로 변경
label.setText(operation);
}
}
}
|
cs |
'💻 수업정리 (2020) > 자바' 카테고리의 다른 글
[6/9] 파일처리 - 텍스트를 이용하여 파일저장, 출력 응용 (0) | 2020.06.09 |
---|---|
[6/8] java.io패키지 (0) | 2020.06.08 |
[6/3] Menu만들기와, Swing이용해보기 (0) | 2020.06.03 |
[6/2] LayoutManager과 EventHandler (0) | 2020.06.02 |
[6/1] 자료구조클래스와 awt패키지 (0) | 2020.06.01 |