スタッフブログ

【速攻Program】第8回_文字列の表示

投稿日:

皆さん、こんにちは!社員のBです。
最近コロナ太りに悩んでおりダイエットしようしようと思っているのですが、
なかなかやる気が出ずに思い通りに痩せることができていない社員のBです。

そういえば先週末に弊社の社員旅行がありました!
場所は、富山は黒部にある宇奈月温泉に行ってまいりました!
宇奈月は黒部でも山側に面している為、とても水がきれいでした!

今回は乗れませんでしたが、
夏から秋のシーズンになると黒部ダムに続くトロッコ電車が走っており、
紅葉の季節には多くの観光客でにぎわうみたいです。

また宇奈月は温泉が有名で、街には足湯が点在してまいた!
この時期なので人がまったく来る気配がなくゆっくりすることができました。

とにかく今回の旅行は食べて食べて食べまくりの旅行だったので、
家に帰って体重を図ったら4Kgくらい太っていたたため、ショック
これからダイエット頑張らないと・・・

とにかく楽しい旅行がでした。社長おいしいごはんと旅行ありがとうございました

さて今回は文字列の表示ということをやっていこうと思います。
が、作っている途中で複数の修正点が見つかりましたので、まずはそこを修正していこうと思います。

それではコマンドプロンプトを開いて前回ダウンロードした、ファイルを開きます。
まずは電卓に文字が表示されていないので表示できるようにしましょう!
出来れば最初っから[ 0 ]を表示させておきたいですよね。

そのためにはまずはFormWindowを作成しているCalculatorFormで文字列を表示させてあげる為のコードを記述する必要があります。
以下のコマンドで対象のファイルを開きます。
C:\Users\username>cd Desktop\JavaTestFolder\Calculator-master\
C:\Users\username\Desktop\JavaTestFolder\Calculator-master>notepad CalculatorForm.java

次に開いたファイルの64行目に(textField = new TextField(textPanel);の下)に以下のコードを記述します。
textField.setText("0");

とりあえずこれで最初に0を表示する事ができました。
ちなみに今回使用しているtextFieldとは、電卓の数値を表示するコンポーネントを指しています。
なのでこの上のコードの意味としては

textField
文字列を表示する場所に
setText
記述してね。
("0");
0という文字を!

といった意味になります。

ここでとりあえず一回起動してどのような不具合が出ているか確認します。
(完成品ができていなく行き当たりばったりでごめんなさい)
以下のコマンドで起動させてください。
C:\Users\username\Downloads\Calculator-master_r1\Calculator-master>javac *.java
C:\Users\username\Downloads\Calculator-master_r1\Calculator-master>java Calculator

とりあえず0という文字が表示されていることがわかります。
次にボタンを押した際に表示が変わらないのでその辺を修正していきましょう。

一度電卓を閉じてもらって次にEventHandleを修正していきます。
因みにイベントハンドルクラスはボタン操作をした際の命令をつかさどるクラスになっております。

そのため、今回はEventHandleを中心に編集することになると思います。
以下のコマンドを投入してください。
C:\Users\username\Desktop\JavaTestFolder\Calculator-master>notepad EventHandle.java

中身を見てみると

public void actionPerformed(ActionEvent e) {
btn_Click(e);
if (symbol.equals("C")) {
btnClear_Click();
}
}

が書いてありますね。ここでボタン操作しています。
ここを修正すればボタンを押した際に数値が表示されそうですね。

下にbtn_Clickの命令がありますので見てください。

//ボタンが押された際の処理
void btn_Click(ActionEvent e) {
//もしも数値なら、整数型に値を入れる。
try {
i = Integer.parseInt(e.getActionCommand());
}
//文字列型だった場合は、文字列型に代入する
catch (Exception exce) {
symbol = e.getActionCommand();
}
}

内容を見てみると押されたボタンに書いてある番号を取得して
数値であれば[ i ]に、文字であれば[ symbol ]に代入していることがわかります。

ではこのiとsymbleはどこでtextField.setTextされているかを探します。

するとButtonクラスで文字表示の処理をまとめて行っているようです。
この辺りはややこしいので編集してほしい箇所だけお伝えします。

まずは、Buttonクラス内でコンストラクタを定義しているのですが、
そこを以下の様に全て修正してください。(Buttonクラス全て書き換えてください。)
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Rectangle;

import javax.swing.JButton;
import javax.swing.JPanel;

public class Button extends JButton {

/**
*
*/
private static final long serialVersionUID = 1L;
JButton button;

public Button() {
this.button = new JButton("Button");
this.setFont(new Font(null, 0, 32));
}

public Button(String text) {
this();
this.setText(text);
this.setName(text);
this.setActionCommand(text);
}

public Button(String text, int width, int height) {
this();
this.setPreferredSize(new Dimension(width, height));
this.setActionCommand(text);
}

public Button(String text, Dimension size) {
this(text);
this.setSize(size);
this.setActionCommand(text);
}

public Button(String text, Rectangle r, JPanel panel, EventHandle ev) {
this(text);
this.setBounds(r);
panel.add(this);
this.setActionCommand(text);
this.addActionListener(ev);
}

public Button(String text, Dimension size, JPanel panel,EventHandle ev) {
this(text, size);
panel.add(this);
this.setActionCommand(text);
this.addActionListener(ev);
}
}

次にボタンを作成している箇所にも修正点がありましたので、
CalculatorFormを以下の様に修正をお願い致します。(全て書き換え)

import java.awt.BorderLayout;
import java.awt.CardLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Rectangle;

import javax.swing.JFrame;
import javax.swing.JTextField;

public class CalculatorForm extends JFrame{

// Declaration Field
public Form form;

static public JTextField textField;

Button btn0;
Button btn1;
Button btn2;
Button btn3;
Button btn4;
Button btn5;
Button btn6;
Button btn7;
Button btn8;
Button btn9;
Button btn00;

Button btnadd;
Button btnsub;
Button btnmal;
Button btndiv;

Button btnpar;
Button btncan;
Button btndot;
Button btnequ;

public CalculatorForm() {
// --------------------- Create Window ---------------------//

// Call the newForm
// hikisu => ("StringTitle,Size(StartPosition.x,StartPosition.y, Width , Height ),LayoutOption)
form = new Form("電卓", new Rectangle(100, 100, 600, 600), new BorderLayout());

//---------------------- Create Panel Area----------------------//
// Create Panel for TextField
// hikisu => (BackgroundColor,size(StartPosition.x,StartPosition.y, Width , Height ),Targetform,LayoutOption)
Panel textPanel = new Panel(new Color(255, 255, 0, 100),
new Dimension(form.getWidth(), 100),
form,
BorderLayout.PAGE_START);

// Create Panel to Display ButtonField
// hikisu => (BackgroundColor,Targetform,LayoutOption)
Panel buttonPanel = new Panel(Color.BLUE, form, BorderLayout.CENTER);
//----------------------- Create TextPanel ----------------------//
// This time,TextPanel is add the TextBox only.
// Used CardDisplay to all Display Panel
// hikisu => (LayoutClass(Horizontal Margin、Vertical Margin))
textPanel.setLayout(new CardLayout(40, 20));
// hikisu =>(PiarentCompornent)
textField = new TextField(textPanel);
textField.setText("0");

//------------------------- Create Button ---------------------------//

//Disigner Button
buttonPanel.setLayout(null);
EventHandle event = new EventHandle();
btn7 = new Button("7", new Rectangle(50, 50, 75, 75), buttonPanel,event);
btn8 = new Button("8", new Rectangle(150, 50, 75, 75), buttonPanel,event);
btn9 = new Button("9", new Rectangle(250, 50, 75, 75), buttonPanel,event);
btnadd = new Button("+", new Rectangle(350, 50, 75, 75), buttonPanel,event);
btnsub = new Button("-", new Rectangle(450, 50, 75, 75), buttonPanel,event);

btn4 = new Button("4", new Rectangle(50, 150, 75, 75), buttonPanel,event);
btn5 = new Button("5", new Rectangle(150, 150, 75, 75), buttonPanel,event);
btn6 = new Button("6", new Rectangle(250, 150, 75, 75), buttonPanel,event);
btnmal = new Button("×", new Rectangle(350, 150, 75, 75), buttonPanel,event);
btndiv = new Button("÷", new Rectangle(450, 150, 75, 75), buttonPanel,event);

btn1 = new Button("1", new Rectangle(50, 250, 75, 75), buttonPanel,event);
btn2 = new Button("2", new Rectangle(150, 250, 75, 75), buttonPanel,event);
btn3 = new Button("3", new Rectangle(250, 250, 75, 75), buttonPanel,event);
btnpar = new Button("%", new Rectangle(350, 250, 75, 75), buttonPanel,event);
btndot = new Button(".", new Rectangle(450, 250, 75, 75), buttonPanel,event);

btn0 = new Button("0", new Rectangle(50, 350, 75, 75), buttonPanel,event);
btn00 = new Button("00", new Rectangle(150, 350, 75, 75), buttonPanel,event);
btnequ = new Button("=", new Rectangle(250, 350, 75, 75), buttonPanel,event);
btncan = new Button("C", new Rectangle(350, 350, 75, 75), buttonPanel,event);

//------------------ lastTime enable Display Setting----------------------//
form.setVisible(true);
}
}

とりあえずはコメントを付けておきましたので、何をやっているか詳細を知りたいかたは
コメントを見てみてください。

前置きがながくなってしまいましたが、
ここから文字列の表示を行っていきたいと思います。

現在はただテキストフィールドに0が表示されているだけとなっていると思います。
そのため今回は以下の3つの修正をおこなっていきます。

①文字を表示する
②記号も押したら表示されるようにする。
③打たれた際につなげて表示する

とりあえずバグだらけになると思いますが、
今回はこれの実装を行います。

それではEventHandleを開きコードを記載します。
まずは数値を表示させていきます。

条件としては、ボタンを押したときのボタンの表示がiに代入される為、
iが0以上であれば表示してあげればよさそうですね。

actionPerformedメソッド内に以下を記述します。

if(i >= 0){
textField.setText(String.valueOf(i));
}

ここではif文を使用してiが何なのかを判別して、
数値が0以上であれば表示してあげる処理をしています。

鋭い方は
textField.setText(e.getActionCommand());
を直接入れればいいんじゃない?

と思われるかもしれませんが、本来はそのような書き方でよいのですが、
今回は電卓の為、文字と数値を分けたいためわざわざ上記のような処理にしております。

また、iの初期値を宣言と共に-1にしておきましょう!
-1にしておくことでiがまだ代入されていないようにコンピュータに教えてあげます。

//テキストフィールドに表示する数値を格納する変数
int i = -1;

次に文字も表示できるようにしたいと思います。
actionPerformedを以下の様に書き換えてあげましょう

public void actionPerformed(ActionEvent e) {

//ボタンをクリックした際の処理
btn_Click(e);
//もし押されたボタンが「C」だった場合はbtnClear_Click()の処理を行い最初に戻る
if (symbol == ('C')) {
btnClear_Click();
return;
}else if(i == -1){
textField.setText(String.valueOf(symbol));
}

if(i >= 0){
textField.setText(String.valueOf(i));
}
}

またsymbolの宣言の際にも?が入っているようにしてあげましょう。
char symbol = '?';

これでiが-1の時(数値が入っていない状況の場合のみ)文字が表示されるようになりました。

後は文字列の連結ですね!
ここに関しては、初回の入力と二回目以降の処理を分けなくてはいけないですね!
(いきなり記号が来たら訳が分からなくなってしまう為)

そこに関しては、フラグで制御してあげるのがいいかもしれませんね。
フラグでisFirst的なものを作ってあげましょう
変数の宣言エリアに
boolean isFirst = true;
と記載してあると思います。(もしない場合は記載してください)

これを使用して処理を分けましょう。イメージとしては以下となります。

if(isFirst == true){
一文字目の処理
}else{
二文字目以降の処理
}

一文字目は0が入っている為連結すると変なことになるため、
先程記述した処理が一回目でいいかと思います。

二回目以降の処理としてはとりあえず連結させてあげましょうか?
そのためには今あるtextFieldの文字をゲットしてあげる必要があります。
また、一回目を打った瞬間にisFirstフラグをfalseにしてあげる必要があることに注意しましょう!

public void actionPerformed(ActionEvent e) {

// ボタンをクリックした際の処理
btn_Click(e);

if(isFirst==true){
//もし押されたボタンが「C」だった場合はbtnClear_Click()の処理を行い最初に戻る
if (symbol == ('C')) {
btnClear_Click();
return;
}else if(i == -1){
textField.setText(String.valueOf(symbol));
}

if(i >= 0){
textField.setText(String.valueOf(i));
}
isFirst = false;
}else{
textField.setText(textField.getText() + String.valueOf(i));
}
}

めっちゃバグだらけで申し訳ないですが、
今回はここまでにします!次回はここら辺を一回復習しながらきれいにしていきましょう!

今回はスタッフインタビューです!

スタッフ・インタビュー①

当社のエンジニアスタッフにインタビューを行いました!先輩たちの「生の声」をご紹介します。これから就職や転職を考えていらっしゃる皆さまのご参考になれば幸いです。

まずは、入社2年目になりました「Y.K」さんです。

T.O
Y.Kさんが、ウインズに入ろうと思った理由を聞かせてください。
はい。私は以前に勤めていた会社からの転職を考えていたときに、ウインズの社員で、知り合いだったMさんに誘われ、話を聞いているうちに興味を持ち面談を受けさせてもらいました。面談では、お客様や仕事に対しての姿勢や、社員への思いやりなど、社長の考え方に感銘を受けましたし、私のことを考えての業務の提案などもしていただいたことで、入社を決意しました。
Y.K
T.O
そうだったんですね!それで、ウインズに入社してみて、2年目になりますが、実際のところどうですか?
元々IT業界での業務経験はあったのですが、繰り返し試験を実行するなどの業務が多かったんです。ただ、私自身、ネットワーク機器の設計や構築などの業務を目指していたので、社長との面談の際にその話をさせてもらったら、希望にあった現場へ参画することができました。まだまだ日々勉強ではありますが、1年が経過して格段にスキルアップ出来たと感じています!
Y.K
T.O
そうですか!それではこれからも頑張って、更に技術力を磨いてくださいね!会社としてもさまざまな部分でサポートしていきますから!
はい!ありがとうございます。これからも頑張っていきます!
Y.K

いやープログラムって素晴らしいですね!
ではまた次回もお楽しみに!さよなら!さよなら!さよなら!

Copyright© 株式会社ウインズ SES・ITアウトソーシング事業 , 2024 All Rights Reserved Powered by AFFINGER5.