• ベストアンサー

簡易電卓が作れない…

簡易電卓を作ろうとしているのですが、どうしても分からない所があります。 とりあえずテストの為、以下のようなプログラムを作りました。 「dentaku.java」 import java.awt.*; import java.awt.event.*; class dentaku{ public static void main(String[] agrs){ Frame frame=new Frame("電卓"); frame.setSize(500,800); frame.setLayout(null); Button button0=new Button("0"); button0.setLocation(10,710); button0.setSize(80,80); Button buttonC=new Button("C"); buttonC.setLocation(100,710); buttonC.setSize(80,80); Button button1=new Button("1"); button1.setLocation(10,620); button1.setSize(80,80); Button button2=new Button("2"); button2.setLocation(100,620); button2.setSize(80,80); Button button3=new Button("3"); button3.setLocation(190,620); button3.setSize(80,80); Button button4=new Button("4"); button4.setLocation(10,530); button4.setSize(80,80); Button button5=new Button("5"); button5.setLocation(100,530); button5.setSize(80,80); Button button6=new Button("6"); button6.setLocation(190,530); button6.setSize(80,80); Button button7=new Button("7"); button7.setLocation(10,440); button7.setSize(80,80); Button button8=new Button("8"); button8.setLocation(100,440); button8.setSize(80,80); Button button9=new Button("9"); button9.setLocation(190,440); button9.setSize(80,80); Button buttonP=new Button("+"); buttonP.setLocation(280,440); buttonP.setSize(80,80); Button buttonM=new Button("-"); buttonM.setLocation(280,530); buttonM.setSize(80,80); Button buttonK=new Button("×"); buttonK.setLocation(280,620); buttonK.setSize(80,80); Button buttonW=new Button("÷"); buttonW.setLocation(280,710); buttonW.setSize(80,80); TextField nyuuryoku = new TextField(""); nyuuryoku.setLocation(10,380); nyuuryoku.setSize(350,50); TextField kekka = new TextField("0"); kekka.setLocation(10,320); kekka.setSize(350,50); button1.addActionListener(new dentaku_num(nyuuryoku)); button2.addActionListener(new dentaku_num(nyuuryoku)); frame.add(button0); frame.add(buttonC); frame.add(button1); frame.add(button2); frame.add(button3); frame.add(button4); frame.add(button5); frame.add(button6); frame.add(button7); frame.add(button8); frame.add(button9); frame.add(buttonP); frame.add(buttonM); frame.add(buttonK); frame.add(buttonW); frame.add(nyuuryoku); frame.add(kekka); frame.setVisible(true); } } 「dentaku_num.java」 import java.awt.*; import java.awt.event.*; class dentaku_num implements ActionListener{ TextField txt; int num=0; Button button1; Button button2; dentaku_num(TextField txt){ this.txt = txt; } public void actionPerformed(ActionEvent e){ if(e.getSource()== button1) {num=1;} if(e.getSource()== button2) {num=2;} txt.setText(String.valueOf(num)); } } 予想では、「1」を押したら下のテクストボックスに1が、「2」を押したら2が表示されると思いました。 しかし結果は、両方とも「0」が表示されるだけです。 不思議に思い、「if(e.getSorce)~」の2文を消してみたら、これも同じ結果でした。 どうやら、eを受け取っていない(?)ようなのですが、どの様にしたらうまく行くでしょうか。 見づらい分だとは思いますが、宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

public void actionPerformed(ActionEvent e){ if(e.getActionCommand().equals("1")) {num=1;} if(e.getActionCommand().equals("2")) {num=2;} txt.setText(String.valueOf(num)); } これでどうでしょ?

ko567
質問者

お礼

回答、有難う御座います。 試してみたところ、この方法でうまく行きました! これは多分、文字を判定しているんですよね。 無理してe.getSorceにこだわっていたのがいけなかったのか…。 恐れ入りますが、e.getSorceを使った方法も教えて下さると幸いです。

その他の回答 (2)

回答No.3

>恐れ入りますが、e.getSorceを使った方法も教えて下さると幸いです。 dentaku_num.javaにおそらく比較用に  Button button1;  Button button2; を定義しているんだろうけど、定義しっぱなしなので、 actionPerformedメソッドでは中身がない状態。 だから「e.getSource()」でイベント発生元のオブジェクトを取得しても、比較するbutton1やbutton2が中身がないので条件式が成り立たなくて「num」に値がセットされない。 で、どうすれば良いかというと、button1とbutton2にちゃんと「dentaku.java」でのbutton1とかbutton2のインスタンスをセットすれば良い。 が、どうしてもe.getSource()を使いたいなら仕方ないけど、 せっかくActionEventの処理用に別クラスにしたのに、必要のないボタンのインスタンスを持つのはいただけない。 No.1さんの様にgetActionCommand()を使えばボタンのインスタンスを持つ必要はなくなる。 ボタンのアクションコマンドはデフォルトではボタンに表示されている文字列。 setActionCommand()で設定できる。 詳細はJavaDocを。

ko567
質問者

お礼

自分の頭では「このボタンを押したらこの処理をやってくれるようにしたい!」と思っていたのですが、考えてみれば別のクラスにすれば良かったのですよね。 どうやら、その方法とe.getSource()を使って無理やり一クラスで纏める方法は無駄ができてしまいそうなので、やめておくことにします。 結局、dentaku_numクラスは以下のようにしました。 「dentaku_num.java」 import java.awt.*; import java.awt.event.*; class dentaku_num implements ActionListener{ TextField nyuuryoku; dentaku_num(TextField nyuuryoku){ this.nyuuryoku = nyuuryoku; } public void actionPerformed(ActionEvent e){ String tmp = nyuuryoku.getText(); String n = e.getActionCommand(); if (tmp == "") nyuuryoku.setText(n); else nyuuryoku.setText(tmp + n); } } 演算子の判別は、別のクラスでNo.1さんが教えて下さった方法を用いています。 この度は有難う御座いました。

回答No.2

http://www.geocities.jp/s2412502/layoutsample.html そのものずばり簡易電卓。