質問をすることでしか得られない、回答やアドバイスがある。

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

ただいまの
回答率

91.03%

  • Java

    12125questions

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

  • if

    166questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

if文の分岐がうまくいかない

解決済

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 232

miyabi6184

score 24

今自作の電卓を作っているのですが
数字を足すところまではできたのですが
+を押して2番目の値を入力することができません
演算子を変えてみたりもしましたが無理でした

+を押すとatai1が一回目は初期化されてまた数値が足されて
二回目は初期化されずに足されていくばかりでした

どのようにしたらいいのか
ご回答お願いします

import java.math.BigInteger;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JLabel;
import javax.swing.JButton;

import java.awt.Color;
import java.awt.BorderLayout;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

public class denntaku extends JFrame implements ActionListener{

    JPanel Panel;

    JLabel atai1;
    JLabel atai2;
    JLabel atai3;

    JButton zero;
    JButton one;
    JButton two;
    JButton three;
    JButton fore;
    JButton five;
    JButton six;
    JButton seven;
    JButton eight;
    JButton nine;

    JButton plus;

    public static final String Cmd_zero = "zero";
    public static final String Cmd_one = "one";
    public static final String Cmd_two = "two";
    public static final String Cmd_three = "three";
    public static final String Cmd_fore = "fore";
    public static final String Cmd_five = "five";
    public static final String Cmd_six = "six";
    public static final String Cmd_seven = "seven";
    public static final String Cmd_eight = "eight";
    public static final String Cmd_nine = "nine";

    public static final String Cmd_plus = "plus";

    int count;

    int NN1;
    int NN2;
    int NN3;

    String NNN1;
    String NNN2;
    String NNN3;

    public static void main(String[] args){

        denntaku Frame = new denntaku();
        Frame.setSize(500, 400);
        Frame.setTitle("自作電卓");
        Frame.setLocationRelativeTo(null);
        Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        Frame.setVisible(true);

    }

    denntaku(){

        count = 0;

        NN1 = 0;
        NN2 = 0;
        NN3 = 0;

        NNN1 = Integer.toString(NN1);
        NNN2 = Integer.toString(NN2);
        NNN3 = Integer.toString(NN3);

        Panel = new JPanel();
        Panel.setLayout(null);

        atai1 = new JLabel();
        atai2 = new JLabel();
        atai3 = new JLabel();

        atai1.setText(NNN1);
        atai2.setText(NNN2);
        atai3.setText(NNN3);

        atai1.setBounds(10, 10, 100, 20);
        atai2.setBounds(10, 30, 100, 20);
        atai3.setBounds(10, 50, 100, 20);

        zero = new JButton("0");
        one = new JButton("1");
        two = new JButton("2");
        three = new JButton("3");
        fore = new JButton("4");
        five = new JButton("5");
        six = new JButton("6");
        seven = new JButton("7");
        eight = new JButton("8");
        nine = new JButton("9");

        plus = new JButton("+");

        zero.setBounds(70, 230, 50, 50);
        one.setBounds(20, 80, 50, 50);
        two.setBounds(70, 80, 50, 50);
        three.setBounds(120, 80, 50, 50);
        fore.setBounds(20, 130, 50, 50);
        five.setBounds(70, 130, 50, 50);
        six.setBounds(120, 130, 50, 50);
        seven.setBounds(20, 180, 50, 50);
        eight.setBounds(70, 180, 50, 50);
        nine.setBounds(120, 180, 50, 50);

        plus.setBounds(170, 80, 50, 50);

        zero.setForeground(Color.BLACK);
        zero.setBackground(Color.WHITE);
        one.setForeground(Color.BLACK);
        one.setBackground(Color.WHITE);
        two.setForeground(Color.BLACK);
        two.setBackground(Color.WHITE);
        three.setForeground(Color.BLACK);
        three.setBackground(Color.WHITE);
        fore.setForeground(Color.BLACK);
        fore.setBackground(Color.WHITE);
        five.setForeground(Color.BLACK);
        five.setBackground(Color.WHITE);
        six.setForeground(Color.BLACK);
        six.setBackground(Color.WHITE);
        seven.setForeground(Color.BLACK);
        seven.setBackground(Color.WHITE);
        eight.setForeground(Color.BLACK);
        eight.setBackground(Color.WHITE);
        nine.setForeground(Color.BLACK);
        nine.setBackground(Color.WHITE);

        plus.setForeground(Color.BLACK);
        plus.setBackground(Color.WHITE);

        zero.setHorizontalAlignment(JButton.CENTER);
        zero.setVerticalAlignment(JButton.CENTER);
        one.setHorizontalAlignment(JButton.CENTER);
        one.setVerticalAlignment(JButton.CENTER);
        two.setHorizontalAlignment(JButton.CENTER);
        two.setVerticalAlignment(JButton.CENTER);
        three.setHorizontalAlignment(JButton.CENTER);
        three.setVerticalAlignment(JButton.CENTER);
        fore.setHorizontalAlignment(JButton.CENTER);
        fore.setVerticalAlignment(JButton.CENTER);
        five.setHorizontalAlignment(JButton.CENTER);
        five.setVerticalAlignment(JButton.CENTER);
        six.setHorizontalAlignment(JButton.CENTER);
        six.setVerticalAlignment(JButton.CENTER);
        seven.setHorizontalAlignment(JButton.CENTER);
        seven.setVerticalAlignment(JButton.CENTER);
        eight.setHorizontalAlignment(JButton.CENTER);
        eight.setVerticalAlignment(JButton.CENTER);
        nine.setHorizontalAlignment(JButton.CENTER);
        nine.setVerticalAlignment(JButton.CENTER);

        plus.setHorizontalAlignment(JButton.CENTER);
        plus.setVerticalAlignment(JButton.CENTER);

        zero.setActionCommand(Cmd_zero);
        one.setActionCommand(Cmd_one);
        two.setActionCommand(Cmd_two);
        three.setActionCommand(Cmd_three);
        fore.setActionCommand(Cmd_fore);
        five.setActionCommand(Cmd_five);
        six.setActionCommand(Cmd_six);
        seven.setActionCommand(Cmd_seven);
        eight.setActionCommand(Cmd_eight);
        nine.setActionCommand(Cmd_nine);

        plus.setActionCommand(Cmd_plus);

        Panel.add(atai1);
        Panel.add(atai2);
        Panel.add(atai3);

        Panel.add(zero);
        Panel.add(one);
        Panel.add(two);
        Panel.add(three);
        Panel.add(fore);
        Panel.add(five);
        Panel.add(six);
        Panel.add(seven);
        Panel.add(eight);
        Panel.add(nine);

        Panel.add(plus);

        getContentPane().add(Panel, BorderLayout.CENTER);

        zero.addActionListener(this);
        one.addActionListener(this);
        two.addActionListener(this);
        three.addActionListener(this);
        fore.addActionListener(this);
        five.addActionListener(this);
        six.addActionListener(this);
        seven.addActionListener(this);
        eight.addActionListener(this);
        nine.addActionListener(this);

        plus.addActionListener(this);

    }

    public void actionPerformed(ActionEvent e){

        String cmd = e.getActionCommand();

        if(cmd.equals(Cmd_plus)){

            count = 1;

        }

        if(cmd.equals(Cmd_zero) && count == 0){

            NN1 += 0;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_one) && count == 0){

            NN1 += 1;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_two) && count == 0){

            NN1 += 2;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_three) && count == 0){

            NN1 += 3;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_fore) && count == 0){

            NN1 += 4;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_five) && count == 0){

            NN1 += 5;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_six) && count == 0){

            NN1 += 6;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_seven) && count == 0){

            NN1 += 7;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_eight) && count == 0){

            NN1 += 8;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }

        if(cmd.equals(Cmd_nine) && count == 0){

            NN1 += 9;
            NNN1 = Integer.toString(NN1);
            atai1.setText(NNN1);

        }



        if(cmd.equals(Cmd_zero) && count == 1){

            NN2 += 0;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_one) && count == 1){

            NN2 += 1;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_two) && count == 1){

            NN2 += 2;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_three) && count == 1){

            NN2 += 3;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_fore) && count == 1){

            NN2 += 4;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_five) && count == 1){

            NN2 += 5;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_six) && count == 1){

            NN2 += 6;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_seven) && count == 1){

            NN2 += 7;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_eight) && count == 1){

            NN2 += 8;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

        if(cmd.equals(Cmd_nine) && count == 1){

            NN2 += 9;
            NNN2 = Integer.toString(NN2);
            atai1.setText(NNN2);

        }

    }

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • LouiS0616

    2017/10/18 22:22

    コードを見ると何度も何度も同じような処理を書いているようですが... このようなときこそ、クラスの有用性を知るよい機会だと思うのですが、そちらの勉強はまだしないのですか?

    キャンセル

  • miyabi6184

    2017/10/18 22:24

    今勉強中なのですがまだよく理解できなくて使ってないです すいません

    キャンセル

  • LouiS0616

    2017/10/18 22:28

    うーん... それだったら、とりあえず配列やリストを使うだけでもコード量が激減すると思うのですが...

    キャンセル

  • miyabi6184

    2017/10/18 22:33

    頑張ってもう一度考え直してみます

    キャンセル

回答 2

+2

直接的な原因

不具合の直接的な原因は、countの値が0のときと1のときの処理がほぼ同じだからです。

if(cmd.equals(Cmd_zero) && count == 0){
    NN1 += 0;
    NNN1 = Integer.toString(NN1);
    atai1.setText(NNN1);
}

...

if(cmd.equals(Cmd_zero) && count == 1){
    NN2 += 0;
    NNN2 = Integer.toString(NN2);
    atai1.setText(NNN2);
}

↑ どちらも結局atai1ラベルにテキストを設定している。

潜在的な原因

似たコードを何度も書いて、保守拡張性が著しく低下しているためです。

  • ボタンzero, one, two...
    配列やリストを使わないのでしょうか?
    そもそもひな型が全く同じなのであればクラスを定義すべきです。
  • atai1, atai2...
    変数名からラベルと言う役割がほとんど想像できません。
  • フラグとして用いられるcount
    スコープの広いフラグ変数は避けるべきです。じきに管理しきれなくなります。
  • 延々と続くsetBound
    GridLayoutなど、便利なレイアウト機能が色々ありますよ。

追記

突き放すだけ、というのも申し訳ないので、簡単なサンプルを組みました。
詳しくは後述しますが、ディテールはわざとスカスカにしてあります。
実行例
Calculator.java

package calculator;

import javax.swing.*;

public class Calculator extends JFrame {
    private Calculator(String title) {
        super(title);

        Model model = new Model();
        add(new GUI(model));

        pack();
        setResizable(false);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args){
        Calculator calc = new Calculator("My calculator");
        calc.setLocationRelativeTo(null);
        calc.setVisible(true);
    }
}

GUI.java

package calculator;

import javax.swing.*;
import java.awt.*;
import java.util.Arrays;
import java.util.List;

class GUI extends JPanel {
    private Model model;
    private JLabel displayLabel;

    GUI(Model model) {
        this.model = model;
        model.registerGUI(this);

        displayLabel = new JLabel("0", JLabel.RIGHT);
        displayLabel.setFont(
            new Font("Arial", Font.PLAIN, 64)
        );
        displayLabel.setBackground(Color.LIGHT_GRAY);

        setLayout(new BorderLayout());
        add(displayLabel, BorderLayout.NORTH);
        add(new ButtonPanel(), BorderLayout.SOUTH);
    }

    int getValue() {
        return Integer.valueOf(displayLabel.getText());
    }
    void setValue(int value) {
        displayLabel.setText(String.valueOf(value));
    }

    private class ButtonPanel extends JPanel {
        ButtonPanel() {
            setLayout(new GridLayout(4, 4));

            for(String elem: keyList){
                add(new MyButton(elem, model));
            }
        }

        private List<String> keyList = Arrays.asList(
             "1", "2", "3", "+",
             "4", "5", "6", "-",
             "7", "8", "9", "*",
             "C", "0", "=", "/"
        );
    }

    class MyButton extends JButton {
        MyButton(String text, Model model) {
            super(text);
            setFont(
                    new Font("Arial", Font.PLAIN, 32)
            );

            setForeground(Color.BLACK);
            setBackground(Color.WHITE);

            setHorizontalAlignment(JButton.CENTER);
            setVerticalAlignment(JButton.CENTER);

            setPreferredSize(
                    new Dimension(128, 64)
            );

            addActionListener(
                    evt -> model.operate(text)
            );
        }
    }
}

Model.java

package calculator;

class Model {
    private GUI gui;

    void registerGUI(GUI gui) {
        this.gui = gui;
    }

    void operate(String text) {
        int nowValue = gui.getValue();
        String nowText = nowValue == 0 ? "" : String.valueOf(nowValue);

        switch(text) {
        case "C":
            nowText = "0";
            break;

        case "+": case "-": case "*": case "/":
            break;

        case "=":
            break;

        // number
        default:
            if (nowText.length() > 8) break;
            nowText += text;
            break;
        }

        gui.setValue(Integer.valueOf(nowText));
    }
}

欠陥のある点
・ 実際に動作するのは値の入力とクリアだけで、後は未実装
・ 整数以外が登場する演算に対応できない設計
...どうしてそうなのかはちょっと考えればわかります。
・ 掛け算を実装してもし実行すると、桁あふれが起きる恐れがある

拡張できそうな点
・ 単項演算の追加
...lnとかsinとかexpとかabsとかを足してみるとよいでしょう。
・ 対応桁数の増加
・ 入力された演算子の表示


新しい何かを勉強する際に重要なことは、他の人の書いたコードをよく読むことです。
最初は見よう見まねでも、必死に理解/模倣をするうちに、少しずつわかるものもあります。
また、基礎的な部分はよく学び、積極的に応用するようにしましょう。

ただ、私自身日頃からSwingを使っているわけではありません。
上記のサンプルコードの中でも、良くない点がきっとあるかと思います。
電卓の実装は他にもいろいろあるかと思います。調べて良い部分を吸収してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

check解決した方法

0

もう一度考えてみます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 91.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    12125questions

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

  • if

    166questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。