回答編集履歴

4

追記

2017/10/18 15:41

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -379,3 +379,21 @@
379
379
  ・ **対応桁数の増加**
380
380
 
381
381
  ・ **入力された演算子の表示**
382
+
383
+
384
+
385
+ ---
386
+
387
+ 新しい何かを勉強する際に重要なことは、他の人の書いたコードをよく読むことです。
388
+
389
+ 最初は見よう見まねでも、必死に理解/模倣をするうちに、少しずつわかるものもあります。
390
+
391
+ また、基礎的な部分はよく学び、積極的に応用するようにしましょう。
392
+
393
+
394
+
395
+ ただ、私自身日頃からSwingを使っているわけではありません。
396
+
397
+ 上記のサンプルコードの中でも、良くない点がきっとあるかと思います。
398
+
399
+ 電卓の実装は他にもいろいろあるかと思います。調べて良い部分を吸収してください。

3

実行例の追加

2017/10/18 15:41

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -74,7 +74,7 @@
74
74
 
75
75
  詳しくは後述しますが、ディテールはわざとスカスカにしてあります。
76
76
 
77
-
77
+ ![実行例](a93596813a13d6a4d74e25753d872b74.jpeg)
78
78
 
79
79
  **Calculator.java**
80
80
 

2

追記

2017/10/18 15:34

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
@@ -63,3 +63,319 @@
63
63
  - **延々と続くsetBound**
64
64
 
65
65
  GridLayoutなど、便利なレイアウト機能が色々ありますよ。
66
+
67
+
68
+
69
+ 追記
70
+
71
+ ---
72
+
73
+ 突き放すだけ、というのも申し訳ないので、簡単なサンプルを組みました。
74
+
75
+ 詳しくは後述しますが、ディテールはわざとスカスカにしてあります。
76
+
77
+
78
+
79
+ **Calculator.java**
80
+
81
+ ```Java
82
+
83
+ package calculator;
84
+
85
+
86
+
87
+ import javax.swing.*;
88
+
89
+
90
+
91
+ public class Calculator extends JFrame {
92
+
93
+ private Calculator(String title) {
94
+
95
+ super(title);
96
+
97
+
98
+
99
+ Model model = new Model();
100
+
101
+ add(new GUI(model));
102
+
103
+
104
+
105
+ pack();
106
+
107
+ setResizable(false);
108
+
109
+ setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
110
+
111
+ }
112
+
113
+
114
+
115
+ public static void main(String[] args){
116
+
117
+ Calculator calc = new Calculator("My calculator");
118
+
119
+ calc.setLocationRelativeTo(null);
120
+
121
+ calc.setVisible(true);
122
+
123
+ }
124
+
125
+ }
126
+
127
+ ```
128
+
129
+
130
+
131
+ **GUI.java**
132
+
133
+ ```Java
134
+
135
+ package calculator;
136
+
137
+
138
+
139
+ import javax.swing.*;
140
+
141
+ import java.awt.*;
142
+
143
+ import java.util.Arrays;
144
+
145
+ import java.util.List;
146
+
147
+
148
+
149
+ class GUI extends JPanel {
150
+
151
+ private Model model;
152
+
153
+ private JLabel displayLabel;
154
+
155
+
156
+
157
+ GUI(Model model) {
158
+
159
+ this.model = model;
160
+
161
+ model.registerGUI(this);
162
+
163
+
164
+
165
+ displayLabel = new JLabel("0", JLabel.RIGHT);
166
+
167
+ displayLabel.setFont(
168
+
169
+ new Font("Arial", Font.PLAIN, 64)
170
+
171
+ );
172
+
173
+ displayLabel.setBackground(Color.LIGHT_GRAY);
174
+
175
+
176
+
177
+ setLayout(new BorderLayout());
178
+
179
+ add(displayLabel, BorderLayout.NORTH);
180
+
181
+ add(new ButtonPanel(), BorderLayout.SOUTH);
182
+
183
+ }
184
+
185
+
186
+
187
+ int getValue() {
188
+
189
+ return Integer.valueOf(displayLabel.getText());
190
+
191
+ }
192
+
193
+ void setValue(int value) {
194
+
195
+ displayLabel.setText(String.valueOf(value));
196
+
197
+ }
198
+
199
+
200
+
201
+ private class ButtonPanel extends JPanel {
202
+
203
+ ButtonPanel() {
204
+
205
+ setLayout(new GridLayout(4, 4));
206
+
207
+
208
+
209
+ for(String elem: keyList){
210
+
211
+ add(new MyButton(elem, model));
212
+
213
+ }
214
+
215
+ }
216
+
217
+
218
+
219
+ private List<String> keyList = Arrays.asList(
220
+
221
+ "1", "2", "3", "+",
222
+
223
+ "4", "5", "6", "-",
224
+
225
+ "7", "8", "9", "*",
226
+
227
+ "C", "0", "=", "/"
228
+
229
+ );
230
+
231
+ }
232
+
233
+
234
+
235
+ class MyButton extends JButton {
236
+
237
+ MyButton(String text, Model model) {
238
+
239
+ super(text);
240
+
241
+ setFont(
242
+
243
+ new Font("Arial", Font.PLAIN, 32)
244
+
245
+ );
246
+
247
+
248
+
249
+ setForeground(Color.BLACK);
250
+
251
+ setBackground(Color.WHITE);
252
+
253
+
254
+
255
+ setHorizontalAlignment(JButton.CENTER);
256
+
257
+ setVerticalAlignment(JButton.CENTER);
258
+
259
+
260
+
261
+ setPreferredSize(
262
+
263
+ new Dimension(128, 64)
264
+
265
+ );
266
+
267
+
268
+
269
+ addActionListener(
270
+
271
+ evt -> model.operate(text)
272
+
273
+ );
274
+
275
+ }
276
+
277
+ }
278
+
279
+ }
280
+
281
+ ```
282
+
283
+
284
+
285
+ **Model.java**
286
+
287
+ ```Java
288
+
289
+ package calculator;
290
+
291
+
292
+
293
+ class Model {
294
+
295
+ private GUI gui;
296
+
297
+
298
+
299
+ void registerGUI(GUI gui) {
300
+
301
+ this.gui = gui;
302
+
303
+ }
304
+
305
+
306
+
307
+ void operate(String text) {
308
+
309
+ int nowValue = gui.getValue();
310
+
311
+ String nowText = nowValue == 0 ? "" : String.valueOf(nowValue);
312
+
313
+
314
+
315
+ switch(text) {
316
+
317
+ case "C":
318
+
319
+ nowText = "0";
320
+
321
+ break;
322
+
323
+
324
+
325
+ case "+": case "-": case "*": case "/":
326
+
327
+ break;
328
+
329
+
330
+
331
+ case "=":
332
+
333
+ break;
334
+
335
+
336
+
337
+ // number
338
+
339
+ default:
340
+
341
+ if (nowText.length() > 8) break;
342
+
343
+ nowText += text;
344
+
345
+ break;
346
+
347
+ }
348
+
349
+
350
+
351
+ gui.setValue(Integer.valueOf(nowText));
352
+
353
+ }
354
+
355
+ }
356
+
357
+ ```
358
+
359
+
360
+
361
+ **欠陥のある点**
362
+
363
+ ・ **実際に動作するのは値の入力とクリアだけで、後は未実装**
364
+
365
+ ・ **整数以外が登場する演算に対応できない設計**
366
+
367
+ ...どうしてそうなのかはちょっと考えればわかります。
368
+
369
+ ・ **掛け算を実装してもし実行すると、桁あふれが起きる恐れがある**
370
+
371
+
372
+
373
+ **拡張できそうな点**
374
+
375
+ ・ **単項演算の追加**
376
+
377
+ ...lnとかsinとかexpとかabsとかを足してみるとよいでしょう。
378
+
379
+ ・ **対応桁数の増加**
380
+
381
+ ・ **入力された演算子の表示**

1

再送信

2017/10/18 15:31

投稿

LouiS0616
LouiS0616

スコア35660

test CHANGED
File without changes