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

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

ただいまの
回答率

88.11%

電卓のCEボタンを作りたい

受付中

回答 2

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 505

score 0

Javaで電卓を作成してます。
下のパネル(txt2)に数値を入力し、上のパネル(txt1)に式を出力しようとしています。
実装したいのはCEボタンで、入力数値を削除するものを作成したいのですが、書き方がわからず詰まってしまっていう状態です。
現在入力された数値はArrayListのsHisに入っているため、
その数値を演算子が押されたタイミングで別の配列に保持しようと考えています。

発生している問題・エラーメッセージ

エラーメッセージ

該当のソースコード

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;

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

public class Calc {                         

    /*フレームを作る*/
    private static void createAndShowGUI() {


        /*JFrameオブジェクトを生成する*/
        JFrame frame = new JFrame("CalcMain");   

        /*ウィンドウを閉じるとプログラムが終了する*/
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        MyPanel h = new MyPanel();

        /*フレームにオブジェクトを置く*/
        frame.add(h, BorderLayout.CENTER);      
        /*フレームを必要最小の大きさにする*/
        frame.pack();                          
        /*最小サイズを指定 1.6以上で有効*/
        frame.setMinimumSize(new Dimension(frame.getSize().width, frame.getSize().height));
        /*フレームを表示する*/                                        
        frame.setVisible(true);                


    }

    /*mainメソッド、電卓組み立てる*/
    public static void main(final String[] args) {
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}


/*JPanelを継承したメソッド*/
class MyPanel extends JPanel implements ActionListener { 

    /*数値出力する画面定義*/
    JTextField txt1, txt2 ,txt0;
    /*追加できる配列(できた数値などを追加していく)*/
    ArrayList<String> sHis = new ArrayList<String>();
    int iCnt = 0;

    ArrayList<String> strArray = new ArrayList<String>();
    String s1 = "";



    /*ボタン追加*/
    JButton[] aBtn = new JButton[24];    
    /*ボタンに表示*/
    String [] sBtD = {                            
        "7","8","9","/","←","±",
        "4","5","6","*","CE","tax",
        "1","2","3","−","C","%",
        "0","00","000","+","=","."
    };

    /*画面に出力される*/
    String [] sBtO = {                          
        "7","8","9","/","","*-1",
        "4","5","6","*","","*1.1",
        "1","2","3","-","","*0.01",
        "0","00","000","+","",".",
    };

    public MyPanel() {

        /*txt1の設定 ※上の画面*/
        /*表示は15桁*/
        txt1 = new JTextField(15);      
        /*txt1にアクションを呼び出す*/
        txt1.addActionListener(this);        
        /*フォントを指定する*/
        txt1.setFont(new Font("SansSerif",Font.PLAIN,16));

        /*txt2の設定 ※下の画面*/
        /*表示は15桁*/
        txt2 = new JTextField(15);              
        /*フォントを指定する*/
        txt2.setFont(new Font("SansSerif",Font.ITALIC,16));
        /*表示を右側にする*/
        txt2.setHorizontalAlignment(JTextField.RIGHT);

        txt0 = new JTextField(15);  

        /*くりかえし*/
        for(int i = 0; i< aBtn.length; i++)        
            aBtn[i] = new JButton(sBtD[i]);
        /*aBtn(ボタン)を押したときにおきるアクションを呼び出す*/
        for(JButton b : aBtn)
            b.addActionListener(this);        

        /*パネルのレイアウト*/
        /*式と答えを表示するパネルの定義*/
        JPanel pa = new JPanel();

        pa.setLayout(new GridLayout(2,1));        

        pa.add(txt1);        
        pa.add(txt2);        

        /*パネルの定義*/
        /*ボタンを表示するパネルの定義*/
        JPanel pc = new JPanel();
        pc.setLayout(new GridLayout(4,6));        
        /*aBtn(表示)をボタンに追加する*/
        for(JButton b : aBtn)
            pc.add(b);

        /*パネル(ボタン)をどこに配置するか*/
        setLayout(new BorderLayout(2,2));        
        /*式と答え表示するパネルは真ん中*/
        add(pa, BorderLayout.CENTER);        
        /*ボタンは下*/
        add(pc, BorderLayout.SOUTH);        

    }


        /*ボタンを押したときのアクション*/
         public void actionPerformed(ActionEvent e) {   


           String[] array = strArray.toArray(new String[strArray.size()]);
            /*txt1に値を代入*/
            for (int m =0; m<15; m++) {

                String[] strar = sHis.toArray(new String[sHis.size()]);
                List list = Arrays.asList(strar);


                /*もし演算子が押されたら箱に詰めていく*/
                if(e.getSource()==aBtn[3]|| e.getSource()==aBtn[9]||e.getSource()==aBtn[15]||e.getSource()==aBtn[21]||e.getSource()==aBtn[22]) {

                    /*エラー*/
                    /*わからない部分*/
                    String str1 = sHis.getText();                    
                    strArray.add(sHis.getText());
                    strArray = strar.setText(strar.getText());
                   strArray.add(sHis.getText(aBtn[m]));
                    txt1.setText(strArray.getText());

                   strar[m] = strArray.setText(strArray.getText(sHis));



                }else if(e.getSource()==aBtn[10]) {
                    /*CEボタンを押したら*/
                    /*最後の箱を消す*/s1 = strArray.get(strArray.size()-1);
                    txt1.setText(s1);
                }

            }


            /*数字以外のボタンを押したときにする動き*/
            if (e.getSource()==aBtn[16]) {    //★Cボタンを押したら
                /*txt1とtxt2にあるもの全てを消す*/
                txt1.setText(""); txt2.setText("");

            } else if(e.getSource()==aBtn[4]) {     //バックスペースキー(←)を押したら
                String s    = txt2.getText();
                int    length = s.length();
                /*1文字以上入力されているか*/
                if( length > 0 ){
                    /*1文字削除する*/
                    s = s.substring(0, length-1);
                    /*1文字削除されて0だけ残ったら、それも削除する。*/
                    if( s.equals("0") )
                        s = "";
                    txt2.setText(s);
                }

            }




            /*もし=ボタンが押されたら*/
            if(e.getSource()==aBtn[22]) {        
                String s = txt2.getText(); 
                sHis.add(s); 
                iCnt = sHis.size()-1;            
                /*txt2に計算結果を出す、ゲットする*/
                txt2.setText(CalcMain.sEval(s));

                String str    = txt2.getText();
                int    length = str.length();
                /*1文字以上入力されているか*/
                if( length >= 0 ){


                    /*1文字削除する*/
                    str = str.substring(0, length-1);

                }    
            } 



            /*パネルに追加する、文字を続けて打ち込む繰り返し*/
            for(int i = 0; i< aBtn.length; i++) 

                /*もしaBtnの何かが押されたら*/
                if(e.getSource()==aBtn[i]) 
                    /*txt2に追加していく*/
                    txt2.setText(txt2.getText()+sBtO[i]);

            /*カーソルをあてる*/
            txt2.requestFocus();

    }        
}
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;

class CalcMain {                                        // JsCalc.java [java]
    static ScriptEngineManager factory = new ScriptEngineManager();
    static ScriptEngine engine = factory.getEngineByName("JavaScript");

    // JavaでJavaScriptのeval()関数を呼び出す
    static String sEval(String sExpr) {
        String sScript="with(Math){"+sExpr+"}";       // 「Math.」を省略可能にするため
        try{
            return( engine.eval(sScript).toString() );
        }
        catch(NullPointerException e){               // 関数定義でエラー防止
            return(sExpr);
        }
        catch(Exception e){
            return("error: "+e);
        }
    }

    public static void main(String[] args) {

    }
}

試したこと

多次元配列やListなどの記述方法を探して書いているのですが、書き方に詰まってしまっている状態です。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

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

  • Zuishin

    2020/09/26 12:33

    javasclipt でも JavaScript でもなく Java ですね。
    teratail のためにタグと本文を訂正してください。

    キャンセル

  • kei344

    2020/09/26 12:35

    JavaScriptとJavaは別言語です。質問文内のJavaScriptをJavaに統一し、質問タグから「JavaScript」をはずしてください。

    キャンセル

  • gon3546

    2020/09/26 12:43

    Javaに統一、Sclipt表記を削除しました。
    申し訳ございません。

    キャンセル

  • javahack

    2020/09/27 11:37

    他の質問でZuishinさんが指摘されていますが、相互依存の質問ならばそれぞれの質問を編集して相互依存の質問であることと、他の質問へのリンクを追記してはいかがでしょうか。

    キャンセル

回答 2

0

CEの動作としては直近の数値の削除というよりも、入力中数値のクリアという感じなので、
最後の配列の削除を行うとどんどん配列(式)が消えていきますね。
CEの動作とかけ離れると思います。

なので、確定している式と入力中の数値を分けて考えた方がいいです。
普通に入力中数値(txt2?)をクリアするだけじゃないでしょうか。
電卓の仕様

txt2.setText(""); //個人的には0でもいいと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/26 13:59

    ありがとうございます!
    該当部分修正いたします。
    入力中の数値を保持する部分も詰まってしまっているのですが、記述が上手くいかず保持されません。
    回答いただいた動作も保持が出来ればどうさをするかとおもうのですが、こちらについての記述についてなにかヒント等ありましたらご教授いただけませんでしょうか。
    大変恐縮ではございますが、よろしくお願いいたします。

    キャンセル

  • 2020/09/27 10:25

    申し訳ございません、
    配列の格納について、別途質問をさせていただいており、
    こちらについてもお教えいただきたいのですが可能でしょうか。
    CEボタンにつきまして、配列の問題が解決次第解答いただきました方法を実施させていただきます。

    キャンセル

0

本題の前に List list = Arrays.asList(strar); の行でもエラーが出ていませんか?
List についての import 文がないので、型を判別できてないと思われますのでコンパイルエラーになるはずです。
このListは、Arrays.asList(strar) の戻り値を受け取るのでおそらく、java.util.List インポートすれば良いでしょう。

さて本題です。
変数 sHis は java.util.ArrayList ですが、そのクラスには getText() というメソッドは定義されていないので、コンパイルエラーとなっているのでしょう。
ロジックを見た限り、エラーでわからないとされているところでは、 txt2 から値を取得して、 txt1 に値をセットするのと、 strArray に add するだけで良いように思えますが、どうでしょう?

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2020/09/27 03:22

    コメントありがとうございます!
    Listの方は使わなそうだったので削除します。
    ※Listはインポートしたらエラーが解除されておりました!ありがとうございます!
    txt2をtxt1に持ってくることはできるのですが、連動しているためCEボタンを押すとtxt2の中身が消え、txt1の中身も削除されてしまう状態です。(恐らくstrArrayは表示されていない?)
    sHisの配列をstrArrayに演算子が押されたタイミングで数値を格納し、それをtxt1に表示をしようと思っているのですが、不足の文や記述に関してもお教えいただくことは可能でしょうか。
    色々調べて表示させようとしているのですが、エラーや表示がされずで詰まってしまっております…

    キャンセル

  • 2020/09/27 10:23

    申し訳ございません、
    配列の格納について、別途質問をさせていただいており、
    こちらについてもお教えいただきたいのですが可能でしょうか。
    大変恐縮ではございますが、何卒よろしくお願い致します。

    キャンセル

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

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

関連した質問

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