今からはじめるプログラミング21

ねたが。

まぁRPGをつくってすぐ別のプログラムを用意していたわけもなく。

初心に返って、Javaの勉強をした時のようではない「電卓」を作ってみようかな?と思って、こんな感じかな、とコーディングしてみたのですが。。。やはり計画、設計はできるならばするべきだな、と思い知りました。

とりあえずざっとコーディングしたものをこぴーしますね。

MainClass10

----------------------------------------------------

package sample10;

 

public class MainClass10 {

 

public static void main(String[] arguments) {

new CalculatorFrame();

}

}

----------------------------------------------------

 まぁなんというかこれはこんなだろうと思いますかね?

つぎに表示する画面。

CalculatorFrame

----------------------------------------------------

 

package sample10;

 

import java.awt.Container;

 

import javax.swing.JButton;

import javax.swing.JFrame;

import javax.swing.JTextField;

 

public class CalculatorFrame extends JFrame {

 

private JTextField field = null;

 

public void setText(String str) {

this.field.setText(str);

}

public String getText() {

return this.field.getText();

}

 

public CalculatorFrame() {

init();

}

 

private void init() {

Container container = this.getContentPane();

 

this.setBounds(10, 10, 300, 300);

this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.setTitle("でんたく");

this.field = new JTextField();

 

JButton btn1 = new JButton("1");

JButton btn2 = new JButton("2");

JButton btn3 = new JButton("3");

JButton btn4 = new JButton("4");

JButton btn5 = new JButton("5");

JButton btn6 = new JButton("6");

JButton btn7 = new JButton("7");

JButton btn8 = new JButton("8");

JButton btn9 = new JButton("9");

 

JButton btn0 = new JButton("0");

JButton btnC = new JButton("C");

JButton btnCE = new JButton("CE");

 

JButton btnAddition = new JButton("+");

JButton btnSubtraction = new JButton("-");

JButton btnMultiplication = new JButton("×");

JButton btnDivision = new JButton("/");

 

this.field.setBounds(10, 10, 130, 25);

btn1.setBounds(15, 35, 25, 25);

btn2.setBounds(45, 35, 25, 25);

btn3.setBounds(75, 35, 25, 25);

btn4.setBounds(15, 65, 25, 25);

btn5.setBounds(45, 65, 25, 25);

btn6.setBounds(75, 65, 25, 25);

btn7.setBounds(15, 95, 25, 25);

btn8.setBounds(45, 95, 25, 25);

btn9.setBounds(75, 95, 25, 25);

 

btn0.setBounds(15, 125, 25, 25);

btnC.setBounds(45, 125, 25, 25);

btnCE.setBounds(75, 125, 25, 25);

 

btnAddition.setBounds(105, 35, 25, 25);

btnSubtraction.setBounds(105, 65, 25, 25);

btnMultiplication.setBounds(105, 95, 25, 25);

btnDivision.setBounds(105, 125, 25, 25);

 

container.add(this.field);

container.add(btn1);

container.add(btn2);

container.add(btn3);

container.add(btn4);

container.add(btn5);

container.add(btn6);

container.add(btn7);

container.add(btn8);

container.add(btn9);

 

container.add(btn0);

container.add(btnC);

container.add(btnCE);

 

container.add(btnAddition);

container.add(btnSubtraction);

container.add(btnMultiplication);

container.add(btnDivision);

CalclatorListener listener = new CalclatorListener(this);

btn1.addActionListener(listener);

btn2.addActionListener(listener);

btn3.addActionListener(listener);

btn4.addActionListener(listener);

btn5.addActionListener(listener);

btn6.addActionListener(listener);

btn7.addActionListener(listener);

btn8.addActionListener(listener);

btn9.addActionListener(listener);

 

btn0.addActionListener(listener);

btnC.addActionListener(listener);

btnCE.addActionListener(listener);

 

btnAddition.addActionListener(listener);

btnSubtraction.addActionListener(listener);

btnMultiplication.addActionListener(listener);

btnDivision.addActionListener(listener);

 

btn1.setActionCommand("1");

btn2.setActionCommand("2");

btn3.setActionCommand("3");

btn4.setActionCommand("4");

btn5.setActionCommand("5");

btn6.setActionCommand("6");

btn7.setActionCommand("7");

btn8.setActionCommand("8");

btn9.setActionCommand("9");

 

btn0.setActionCommand("0");

btnC.setActionCommand("C");

btnCE.setActionCommand("CE");

 

btnAddition.setActionCommand("+");

btnSubtraction.setActionCommand("-");

btnMultiplication.setActionCommand("×");

btnDivision.setActionCommand("/");

 

 

this.setVisible(true);

}

}

----------------------------------------------------

 電卓というのはボタンが多くて、それがめんどくさかったです。

そしてなんでパソコン関係は「×(かける)」を「*(アステリスク)」としたのでしょうか?そして「÷(わる)」は「/(スラッシュ)」だし。スラッシュはわかりやすいです?ね。perようするに分数です。(もしかすると違ってるかもしれないけれど。先生おしえてくさい。)

あとこのクラスはデータオブジェクトではないですが、こういう同じ記述の連続するクラスを作る際に、MicrosoftさんのExcel秀丸エディターの「置換」を組み合わせて、数分でつくることができます。データクラスみたなものを作る時便利です。

違う部分(属性など)をExcelにリストとして入力して、前後のセルに同じ文字列をコピーして、入力したものを範囲選択してコピー、秀丸さんにペーストして不要なタブなどを削除。ソースにコピペする。そんなイメージなんですが、伝わらないかな?

そしてこの手のものはExcelのマクロとかVBAで自動でソースを出力するようにしてるプロジェクトとかもありますので、少し考えてみるのもいいと思います。

設計したものが実装になる、ある意味理想的な状態です。

次に、計算をするリスナーです。

CalclatorListener

----------------------------------------------------

package sample10;
import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;
public class CalclatorListener implements ActionListener {
  private String save = null;
  private CalculatorFrame calculatorFrame = null;
  public CalclatorListener(CalculatorFrame calculatorFrame) {  

    this.calculatorFrame = calculatorFrame;

    save = "0";

  }
  @Override

  public void actionPerformed(ActionEvent e) {

    String command = e.getActionCommand(); 

    System.out.println(command);

    String saveValue  = this.save;

    String value = this.calculatorFrame.getText();

    if("".equals(value)) {

        value = "0";

    }

    if("".equals(saveValue)) {

        saveValue = "0";

    }

    int iSave = Integer.parseInt(saveValue);

    int iValue = Integer.parseInt(value);

    if ("+".equals(command)) {

        iSave = iSave + iValue;         

        this.calculatorFrame.setText(Integer.toString(iSave));

       return;

    }

    if ("-".equals(command)) {

        iSave = iSave - iValue;

       this.calculatorFrame.setText(Integer.toString(iSave));

       return;

    }

    if ("×".equals(command)) {

       iSave = iSave * iValue;

       this.calculatorFrame.setText(Integer.toString(iSave));

       return;

    }

    if ("/".equals(command)) {

        iSave = iSave / iValue;

        this.calculatorFrame.setText(Integer.toString(iSave));

        return;

     }

     if ("C".equals(command)) { this.save = "";

          this.calculatorFrame.setText("");

          return;

     }

     if ("CE".equals(command)) {

        this.calculatorFrame.setText("");

        return;

     }

     value += command;

     this.save = value;

     this.calculatorFrame.setText(value);
  }
}

----------------------------------------------------

まだまだ冗長なプログラミングだなぁ、と思いつつ、実行してみました。

f:id:yo2an:20210504201805p:plain

電卓(みかんせい)

そもそも「/(わる)」のボタンがおかしなことになっていますね。。。

そして挙動もおかしいです。

今日はこんなとこですね。

結構すぐできるかと思ったのですが、意外と電卓って難しいですね。

そして自分が受けたセミナーの電卓は単純に2つの入力用フィールドを1つの出力フィールドに計算結果を表示するだけのものだったので、だいぶ違いますが、売ってる電卓に似せたいですので、何回かで作り込んでいきたいです。ボタンも足りないですね。

「/」ボタンがなぜこんな表示なのかもわからない。。。時々こういうイミフなバグに出会うと心が折れます。

sample10.zip - Google ドライブ

そして今では電卓も進化しています。アマゾンのリンクです。

https://amzn.to/3egLhOz