teratail header banner
teratail header banner
質問するログイン新規登録
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

640閲覧

java calculation        

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

2クリップ

投稿2022/06/18 17:14

編集2022/06/20 02:35

0

2

JAVA

1import java.awt.*; 2import java.awt.event.*; 3import javax.swing.JTextField; 4 5

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/18 17:35

ありがとうございます! しっかりありがちな失敗していましたね。 タイトル変更します!
jimbe

2022/06/18 17:51

変更ありがとうございます。 さらにご質問と関係無いことなのですが…AWT と Swing のコンポーネントを混ぜて使うのは不具合の原因になります。( JTexrField は Swing です。) Swing も古いですが AWT はもっと古いですので、どちらかを使うなら Swing のコンポーネントで統一されたほう良いように思います。
退会済みユーザー

退会済みユーザー

2022/06/18 18:07

ありがとうございます。
Zuishin

2022/06/20 03:12

意図的に内容が抹消された質問として低評価しました。 そのようにするのがこのサイトの仕組みです。
guest

回答3

0

ベストアンサー

※ご提示のコードの動作を完全には把握しておりません。

1.最初に表示される0を、数字を入力すると消えるようにしたい。
2.最初に0を続けて入力出来ないようにしたい。

数字を concat している個所で、現在の表示が "0" だったら追加せず置き換える(もしくは消して追加する)ようにすれば良いように思います。

3. 演算子や小数点を連続で押せないように(押しても反応しないように?)したい。

物理的(?)には、最後に押したボタンが何か(演算子かそれ以外か)を保存し、演算子を押した時にその直前に押したボタンも演算子だったら、今押されたボタンは無視する…ようにする感じでしょうか。
ただ、演算子の連続入力は、演算子の押し間違いの修正の機能として活用できますので、修正の方向を検討する余地があるかもしれません。
小数点は、現在の表示に既に小数点があったら無視するのが簡単に思います。

4.計算結果が〇.0の時に小数点を表示させないようにしたい。

double でやるならば、文字列化して小数があったら右から一文字ずつ"0"以外が出るまで"0"を消すというような文字レベルの操作をすることになりそうです。
BigDecimal を用いるなら stripTrailingZeros() というメソッドがやってくれます。


Swing にしたり BigDecimal にしたり enum とかしていたら大分変わってしまいました。
役に立たないかも知れませんが、とりあえず動作を見るような参考程度ということで。

確認の為、ディスプレイ右上に実行する演算子を表示するようにしています。
演算子の連続入力時は最後の演算子を実行するようにしました。
1+2+3+・・・= と連続出来ます。また、1+2= で 3 の表示後に +4= と入力で 7 と計算するようにしています。
(簡単に確認しているだけですので、バグはあるかもしれません。)

Calc.java

java

1import java.awt.*; 2import java.awt.event.ActionListener; 3import java.math.BigDecimal; 4 5import javax.swing.*; 6 7public class Calc extends JFrame { 8 public static void main(String[] args) { 9 SwingUtilities.invokeLater(() -> new Calc().setVisible(true)); 10 } 11 12 Calc() { 13 super("Calc"); 14 setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 15 16 DisplayPanel display = new DisplayPanel(); 17 add(display, BorderLayout.NORTH); 18 19 Calculator calculator = new Calculator(display); 20 21 KeyPanel keyPanel = new KeyPanel(display, calculator); 22 add(keyPanel, BorderLayout.CENTER); 23 24 pack(); 25 setLocationRelativeTo(null); 26 } 27} 28 29class DisplayPanel extends JPanel { 30 private JLabel operationIndicator; 31 private JLabel mainDisplay; 32 private String input = ""; 33 private Operation op; 34 35 DisplayPanel() { 36 super(new BorderLayout()); 37 38 operationIndicator = new JLabel(" "); 39 operationIndicator.setHorizontalAlignment(SwingConstants.RIGHT); 40 operationIndicator.setFont(new Font("Courier", Font.BOLD, 10)); 41 add(operationIndicator, BorderLayout.NORTH); 42 43 mainDisplay = new JLabel("0"); 44 mainDisplay.setHorizontalAlignment(SwingConstants.RIGHT); 45 mainDisplay.setPreferredSize(new Dimension(50, 30)); 46 mainDisplay.setFont(new Font("Courier", Font.BOLD, 15)); 47 add(mainDisplay, BorderLayout.CENTER); 48 } 49 50 void setText(String value) { 51 mainDisplay.setText(value); 52 input = ""; 53 } 54 55 void concat(String c) { 56 if(c.equals(".")) { 57 if(input.contains(".")) return; //多重小数点 ガード 58 if(input.isEmpty()) input = "0"; //"." だけの入力は "0." とする 59 } else if(input.equals("0")) { 60 input = ""; //ZERO ガード 61 } 62 input += c; 63 mainDisplay.setText(input); 64 } 65 66 String getText() { 67 return mainDisplay.getText(); 68 } 69 70 void setOperation(Operation op) { 71 this.op = op; 72 operationIndicator.setText(op == null ? " " : op.text); 73 input = ""; 74 } 75 76 Operation getOperation() { 77 return op; 78 } 79} 80 81enum Operation { 82 ADD("+") { BigDecimal execute(BigDecimal a, BigDecimal b) { return a.add(b); } }, 83 SUB("-") { BigDecimal execute(BigDecimal a, BigDecimal b) { return a.subtract(b); } }, 84 MUL("*") { BigDecimal execute(BigDecimal a, BigDecimal b) { return a.multiply(b); } }, 85 DIV("/") { BigDecimal execute(BigDecimal a, BigDecimal b) { return a.divide(b); } }; //ゼロ割 無視中 86 87 final String text; 88 Operation(String text) { 89 this.text = text; 90 } 91 92 abstract BigDecimal execute(BigDecimal a, BigDecimal b); 93} 94 95class Calculator { 96 private DisplayPanel display; 97 private BigDecimal a; 98 99 Calculator(DisplayPanel display) { 100 this.display = display; 101 } 102 103 void setOperation(Operation operation) { 104 if(display.getOperation() != null) calculation(); //演算子の優先順位は無視中 105 a = new BigDecimal(display.getText()); 106 display.setOperation(operation); 107 } 108 109 void calculation() { 110 BigDecimal b = new BigDecimal(display.getText()); 111 Operation op = display.getOperation(); 112 display.setText((op == null ? b : op.execute(a, b)).stripTrailingZeros().toPlainString()); //余計な "0" は削除 113 display.setOperation(null); 114 } 115} 116 117class KeyPanel extends JPanel { 118 KeyPanel(DisplayPanel display, Calculator calculator) { 119 super(new GridLayout(4, 4)); 120 setFont(new Font("Courier", Font.BOLD, 20)); 121 122 ActionListener concatListener = e -> display.concat(e.getActionCommand()); 123 124 addButton("7", concatListener); 125 addButton("8", concatListener); 126 addButton("9", concatListener); 127 addButton(Operation.DIV, calculator); 128 129 addButton("4", concatListener); 130 addButton("5", concatListener); 131 addButton("6", concatListener); 132 addButton(Operation.MUL, calculator); 133 134 addButton("1", concatListener); 135 addButton("2", concatListener); 136 addButton("3", concatListener); 137 addButton(Operation.SUB, calculator); 138 139 addButton("0", concatListener); 140 addButton(".", concatListener); 141 addButton("=", e -> calculator.calculation()); 142 addButton(Operation.ADD, calculator); 143 } 144 145 private void addButton(String text, ActionListener listener) { 146 JButton b = new JButton(text); 147 b.addActionListener(listener); 148 add(b); 149 } 150 151 private void addButton(Operation op, Calculator calculator) { 152 JButton b = new JButton(op.text); 153 b.addActionListener(e -> calculator.setOperation(op)); 154 add(b); 155 } 156}

投稿2022/06/19 06:15

編集2022/06/19 16:23
jimbe

総合スコア13355

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2022/06/19 10:14

ありがとうございます。難しいですね。 今丁度連続計算出来なくて困ってたところです。
jimbe

2022/06/19 11:24 編集

画面への表示と操作のつじつまを合わせつつどのようなデータをいつどこに設定するか・クリアするか・利用するかを既存の電卓の動作から考えるのが大変ですね。 テキトウにやると if だらけフラグだらけになりそうです。 回答のコードの場合、キー入力は DisplayPanel.input に溜めて表示する一方、計算に使う値は DisplayPanel.mainDisplay から得ているのがミソかなと思います。
guest

0

一部だけ。

1.最初に表示される0を、数字を入力すると消えるようにしたい。
2.最初に0を続けて入力出来ないようにしたい。

diff

1@@ -6,6 +6,7 @@ 2 import java.awt.event.ActionListener; 3 import java.awt.event.WindowAdapter; 4 import java.awt.event.WindowEvent; 5+import java.math.BigDecimal; 6 7 class Key extends Panel { 8 /** 9@@ -59,30 +60,34 @@ 10 JTextField t; 11 Key key; 12 int il; 13+ 14+ private void appendtText(final String text) { 15+ t.setText(new BigDecimal(t.getText().concat(text)).toString()); 16+ } 17 18 public void actionPerformed(ActionEvent e) { 19 if (e.getActionCommand() == "0") { 20- t.setText(t.getText().concat("0")); 21+ appendtText("0"); 22 } else if (e.getActionCommand() == "1") { 23- t.setText(t.getText().concat("1")); 24+ appendtText("1"); 25 } else if (e.getActionCommand() == "2") { 26- t.setText(t.getText().concat("2")); 27+ appendtText("2"); 28 } else if (e.getActionCommand() == "3") { 29- t.setText(t.getText().concat("3")); 30+ appendtText("3"); 31 } else if (e.getActionCommand() == "4") { 32- t.setText(t.getText().concat("4")); 33+ appendtText("4"); 34 } else if (e.getActionCommand() == "5") { 35- t.setText(t.getText().concat("5")); 36+ appendtText("5"); 37 } else if (e.getActionCommand() == "6") { 38- t.setText(t.getText().concat("6")); 39+ appendtText("6"); 40 } else if (e.getActionCommand() == "7") { 41- t.setText(t.getText().concat("7")); 42+ appendtText("7"); 43 } else if (e.getActionCommand() == "8") { 44- t.setText(t.getText().concat("8")); 45+ appendtText("8"); 46 } else if (e.getActionCommand() == "9") { 47- t.setText(t.getText().concat("9")); 48+ appendtText("9"); 49 } else if (e.getActionCommand() == ".") { 50- t.setText(t.getText().concat(".")); 51+ appendtText("."); 52 } 53 54 if (e.getActionCommand() == "+") { 55@@ -132,6 +137,7 @@ 56 t.setHorizontalAlignment(JTextField.RIGHT); 57 t.setPreferredSize(new Dimension(50, 30)); 58 t.setFont(new Font("Courier", Font.BOLD, 15)); 59+ t.setEditable(false); 60 61 add(t, "North"); 62 add(key, "Center");

投稿2022/06/18 21:48

shiketa

総合スコア4133

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1.最初に表示される0を、数字を入力すると消えるようにしたい。
2.最初に0を続けて入力出来ないようにしたい。

数値は文字列で持つのではなく、整数で持つようにすればこの心配はなくなります
0をいくら続けて入力しても0にしかなりません

投稿2022/06/19 01:59

y_waiwai

総合スコア88180

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2022/06/19 02:32 編集

0. と押した場合、数値では 0 と区別がつけられません。 一つの問題が改善するとともに、別の問題が発生することを考慮に入れていない机上の空論です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問