Javaで電卓を作成してます。
下のパネル(txt2)に数値を入力し、上のパネル(txt1)に式を出力しようとしています。
txt2に出力された数値が演算子が入力されたらstrArrayに格納し、strArrayに格納されたものをtxt1に出力されるようにしたいのですが、書き方がわからず詰まってしまっていう状態です。
こちらが動くような記述を教えていただけませんでしょうか。
発生している問題・エラーメッセージ
書き方がわかりません。
該当のソースコード
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 146 147 148 /*もし演算子が押されたら箱に詰めていく*/ 149 if(e.getSource()==aBtn[3]|| e.getSource()==aBtn[9]||e.getSource()==aBtn[15]||e.getSource()==aBtn[21]||e.getSource()==aBtn[22]) { 150 151 /*エラー*/ 152 /*わからない部分*/ 153 String str1 = sHis.getText(); 154 strArray.add(sHis.getText()); 155 strArray = strar.setText(strar.getText()); 156 strArray.add(sHis.getText(aBtn[m])); 157 txt1.setText(strArray.getText()); 158 159 strar[m] = strArray.setText(strArray.getText(sHis)); 160 161 162 163 }else if(e.getSource()==aBtn[10]) { 164 /*CEボタンを押したら*/ 165 /*最後の箱を消す*/s1 = strArray.get(strArray.size()-1); 166 txt1.setText(s1); 167 } 168 169 } 170 171 172 /*数字以外のボタンを押したときにする動き*/ 173 if (e.getSource()==aBtn[16]) { //★Cボタンを押したら 174 /*txt1とtxt2にあるもの全てを消す*/ 175 txt1.setText(""); txt2.setText(""); 176 177 } else if(e.getSource()==aBtn[4]) { //バックスペースキー(←)を押したら 178 String s = txt2.getText(); 179 int length = s.length(); 180 /*1文字以上入力されているか*/ 181 if( length > 0 ){ 182 /*1文字削除する*/ 183 s = s.substring(0, length-1); 184 /*1文字削除されて0だけ残ったら、それも削除する。*/ 185 if( s.equals("0") ) 186 s = ""; 187 txt2.setText(s); 188 } 189 190 } 191 192 193 194 195 /*もし=ボタンが押されたら*/ 196 if(e.getSource()==aBtn[22]) { 197 String s = txt2.getText(); 198 sHis.add(s); 199 iCnt = sHis.size()-1; 200 /*txt2に計算結果を出す、ゲットする*/ 201 txt2.setText(CalcMain.sEval(s)); 202 203 String str = txt2.getText(); 204 int length = str.length(); 205 /*1文字以上入力されているか*/ 206 if( length >= 0 ){ 207 208 209 /*1文字削除する*/ 210 str = str.substring(0, length-1); 211 212 } 213 } 214 215 216 217 /*パネルに追加する、文字を続けて打ち込む繰り返し*/ 218 for(int i = 0; i< aBtn.length; i++) 219 220 /*もしaBtnの何かが押されたら*/ 221 if(e.getSource()==aBtn[i]) 222 /*txt2に追加していく*/ 223 txt2.setText(txt2.getText()+sBtO[i]); 224 225 /*カーソルをあてる*/ 226 txt2.requestFocus(); 227 228 } 229} 230 231
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
試したこと
いろんなサイトを見て記述を試したのですが、動くような記述ができません。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。