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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

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

Q&A

2回答

3785閲覧

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

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2020/09/26 03:31

編集2020/09/26 03:46

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

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

エラーメッセージ

該当のソースコード

Java

1import java.awt.BorderLayout; 2import java.awt.Dimension; 3import java.awt.Font; 4import java.awt.GridLayout; 5import java.awt.event.ActionEvent; 6import java.awt.event.ActionListener; 7import java.util.ArrayList; 8 9import javax.swing.JButton; 10import javax.swing.JFrame; 11import javax.swing.JPanel; 12import javax.swing.JTextField; 13 14public class Calc { 15 16 /*フレームを作る*/ 17 private static void createAndShowGUI() { 18 19 20 /*JFrameオブジェクトを生成する*/ 21 JFrame frame = new JFrame("CalcMain"); 22 23 /*ウィンドウを閉じるとプログラムが終了する*/ 24 frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 25 26 MyPanel h = new MyPanel(); 27 28 /*フレームにオブジェクトを置く*/ 29 frame.add(h, BorderLayout.CENTER); 30 /*フレームを必要最小の大きさにする*/ 31 frame.pack(); 32 /*最小サイズを指定 1.6以上で有効*/ 33 frame.setMinimumSize(new Dimension(frame.getSize().width, frame.getSize().height)); 34 /*フレームを表示する*/ 35 frame.setVisible(true); 36 37 38 } 39 40 /*mainメソッド、電卓組み立てる*/ 41 public static void main(final String[] args) { 42 javax.swing.SwingUtilities.invokeLater(new Runnable() { 43 public void run() { 44 createAndShowGUI(); 45 } 46 }); 47 } 48} 49 50 51/*JPanelを継承したメソッド*/ 52class MyPanel extends JPanel implements ActionListener { 53 54 /*数値出力する画面定義*/ 55 JTextField txt1, txt2 ,txt0; 56 /*追加できる配列(できた数値などを追加していく)*/ 57 ArrayList<String> sHis = new ArrayList<String>(); 58 int iCnt = 0; 59 60 ArrayList<String> strArray = new ArrayList<String>(); 61 String s1 = ""; 62 63 64 65 /*ボタン追加*/ 66 JButton[] aBtn = new JButton[24]; 67 /*ボタンに表示*/ 68 String [] sBtD = { 69 "7","8","9","/","←","±", 70 "4","5","6","*","CE","tax", 71 "1","2","3","−","C","%", 72 "0","00","000","+","=","." 73 }; 74 75 /*画面に出力される*/ 76 String [] sBtO = { 77 "7","8","9","/","","*-1", 78 "4","5","6","*","","*1.1", 79 "1","2","3","-","","*0.01", 80 "0","00","000","+","",".", 81 }; 82 83 public MyPanel() { 84 85 /*txt1の設定 ※上の画面*/ 86 /*表示は15桁*/ 87 txt1 = new JTextField(15); 88 /*txt1にアクションを呼び出す*/ 89 txt1.addActionListener(this); 90 /*フォントを指定する*/ 91 txt1.setFont(new Font("SansSerif",Font.PLAIN,16)); 92 93 /*txt2の設定 ※下の画面*/ 94 /*表示は15桁*/ 95 txt2 = new JTextField(15); 96 /*フォントを指定する*/ 97 txt2.setFont(new Font("SansSerif",Font.ITALIC,16)); 98 /*表示を右側にする*/ 99 txt2.setHorizontalAlignment(JTextField.RIGHT); 100 101 txt0 = new JTextField(15); 102 103 /*くりかえし*/ 104 for(int i = 0; i< aBtn.length; i++) 105 aBtn[i] = new JButton(sBtD[i]); 106 /*aBtn(ボタン)を押したときにおきるアクションを呼び出す*/ 107 for(JButton b : aBtn) 108 b.addActionListener(this); 109 110 /*パネルのレイアウト*/ 111 /*式と答えを表示するパネルの定義*/ 112 JPanel pa = new JPanel(); 113 114 pa.setLayout(new GridLayout(2,1)); 115 116 pa.add(txt1); 117 pa.add(txt2); 118 119 /*パネルの定義*/ 120 /*ボタンを表示するパネルの定義*/ 121 JPanel pc = new JPanel(); 122 pc.setLayout(new GridLayout(4,6)); 123 /*aBtn(表示)をボタンに追加する*/ 124 for(JButton b : aBtn) 125 pc.add(b); 126 127 /*パネル(ボタン)をどこに配置するか*/ 128 setLayout(new BorderLayout(2,2)); 129 /*式と答え表示するパネルは真ん中*/ 130 add(pa, BorderLayout.CENTER); 131 /*ボタンは下*/ 132 add(pc, BorderLayout.SOUTH); 133 134 } 135 136 137 /*ボタンを押したときのアクション*/ 138 public void actionPerformed(ActionEvent e) { 139 140 141 String[] array = strArray.toArray(new String[strArray.size()]); 142 /*txt1に値を代入*/ 143 for (int m =0; m<15; m++) { 144 145 String[] strar = sHis.toArray(new String[sHis.size()]); 146 List list = Arrays.asList(strar); 147 148 149 /*もし演算子が押されたら箱に詰めていく*/ 150 if(e.getSource()==aBtn[3]|| e.getSource()==aBtn[9]||e.getSource()==aBtn[15]||e.getSource()==aBtn[21]||e.getSource()==aBtn[22]) { 151 152 /*エラー*/ 153 /*わからない部分*/ 154 String str1 = sHis.getText(); 155 strArray.add(sHis.getText()); 156 strArray = strar.setText(strar.getText()); 157 strArray.add(sHis.getText(aBtn[m])); 158 txt1.setText(strArray.getText()); 159 160 strar[m] = strArray.setText(strArray.getText(sHis)); 161 162 163 164 }else if(e.getSource()==aBtn[10]) { 165 /*CEボタンを押したら*/ 166 /*最後の箱を消す*/s1 = strArray.get(strArray.size()-1); 167 txt1.setText(s1); 168 } 169 170 } 171 172 173 /*数字以外のボタンを押したときにする動き*/ 174 if (e.getSource()==aBtn[16]) { //★Cボタンを押したら 175 /*txt1とtxt2にあるもの全てを消す*/ 176 txt1.setText(""); txt2.setText(""); 177 178 } else if(e.getSource()==aBtn[4]) { //バックスペースキー(←)を押したら 179 String s = txt2.getText(); 180 int length = s.length(); 181 /*1文字以上入力されているか*/ 182 if( length > 0 ){ 183 /*1文字削除する*/ 184 s = s.substring(0, length-1); 185 /*1文字削除されて0だけ残ったら、それも削除する。*/ 186 if( s.equals("0") ) 187 s = ""; 188 txt2.setText(s); 189 } 190 191 } 192 193 194 195 196 /*もし=ボタンが押されたら*/ 197 if(e.getSource()==aBtn[22]) { 198 String s = txt2.getText(); 199 sHis.add(s); 200 iCnt = sHis.size()-1; 201 /*txt2に計算結果を出す、ゲットする*/ 202 txt2.setText(CalcMain.sEval(s)); 203 204 String str = txt2.getText(); 205 int length = str.length(); 206 /*1文字以上入力されているか*/ 207 if( length >= 0 ){ 208 209 210 /*1文字削除する*/ 211 str = str.substring(0, length-1); 212 213 } 214 } 215 216 217 218 /*パネルに追加する、文字を続けて打ち込む繰り返し*/ 219 for(int i = 0; i< aBtn.length; i++) 220 221 /*もしaBtnの何かが押されたら*/ 222 if(e.getSource()==aBtn[i]) 223 /*txt2に追加していく*/ 224 txt2.setText(txt2.getText()+sBtO[i]); 225 226 /*カーソルをあてる*/ 227 txt2.requestFocus(); 228 229 } 230} 231 232

Java

1import javax.script.ScriptEngine; 2import javax.script.ScriptEngineManager; 3 4class CalcMain { // JsCalc.java [java] 5 static ScriptEngineManager factory = new ScriptEngineManager(); 6 static ScriptEngine engine = factory.getEngineByName("JavaScript"); 7 8 // JavaでJavaScriptのeval()関数を呼び出す 9 static String sEval(String sExpr) { 10 String sScript="with(Math){"+sExpr+"}"; // 「Math.」を省略可能にするため 11 try{ 12 return( engine.eval(sScript).toString() ); 13 } 14 catch(NullPointerException e){ // 関数定義でエラー防止 15 return(sExpr); 16 } 17 catch(Exception e){ 18 return("error: "+e); 19 } 20 } 21 22 public static void main(String[] args) { 23 24 } 25} 26 27 28

試したこと

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Zuishin

2020/09/26 03:33

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

2020/09/26 03:35

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

退会済みユーザー

2020/09/26 03:43

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

2020/09/27 02:37

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

回答2

0

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

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

投稿2020/09/26 05:05

ironya

総合スコア456

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/26 18:22

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

退会済みユーザー

2020/09/27 01:23

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

0

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

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

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

投稿2020/09/26 04:32

mikan_s4n

総合スコア377

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2020/09/26 04:59

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

退会済みユーザー

2020/09/27 01:25

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問