実現したいこと
・numActionでは、1~9のボタンのどれかを押したとき、選択されているテキストフィールドに出力したい(135とおしたら135で出力)
・PmActionでテキストフィールドに入力された数字の符号を入れ替え、またテキストフィールドに出力したい
前提
JavaEclipseで電卓のプログラムを作っています。
二点上手くいかない部分がありますが原因は共通していると思われます。
発生している問題・エラーメッセージ
まず、numActionでは、123というように、順番通りに数字を押すと上手くテキストフィールドに表示されますが、157や81などバラバラに押すとテキストフィールドが勝手に空にされてしまいます。
PmActionでは、+/-ボタンを押すと、テキストフィールドに何も表示されなくなります。printlnしてみるとしっかり符号が逆になっているのでテキストフィールドに出力する部分に問題があると考えられます。
空白にしない限りエラーコードは出ません。
該当のソースコード
lang
1 2public class Calculator extends JFrame { 3 4 JTextField input,input2,way, answer; 5 JButton plus, minus, multiple, divide, result, clear, pm, percent, del, few, num, zero; 6 double num1, num2; 7 // String operator = ""; 8 JTextField currentFocusField; // フォーカスされているフィールドを追跡する変数 9 10 public static void main(String[] args) { 11 JFrame w = new Calculator("Calculator"); 12 w.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 13 w.setSize(350, 400); 14 w.setVisible(true); 15 } 16 17 public Calculator(String title) { 18 super(title); 19 JPanel pane = (JPanel) getContentPane(); 20 pane.setLayout(new BorderLayout()); 21 22 JPanel tfpanel=new JPanel(); 23 tfpanel.setLayout(new GridLayout(1,2)); 24 input = new JTextField(5); 25 input.setBorder(new TitledBorder("数1")); 26 input.setDocument(new NumericDocument()); 27 input.addFocusListener(new FocusAdapter() { 28 @Override 29 public void focusGained(FocusEvent e) { 30 currentFocusField = input; // inputがフォーカスされた時 31 } 32 }); 33 tfpanel.add(input); 34 way = new JTextField(1); 35 way.setBorder(new TitledBorder("計算方法")); 36 way.setDocument(new NumericDocument2()); 37 tfpanel.add(way); 38 input2 = new JTextField(5); 39 input2.setBorder(new TitledBorder("数2")); 40 input2.setDocument(new NumericDocument()); 41 input2.addFocusListener(new FocusAdapter() { 42 @Override 43 public void focusGained(FocusEvent e) { 44 currentFocusField = input2; // input2がフォーカスされた時 45 } 46 }); 47 tfpanel.add(input2); 48 49 pane.add(tfpanel, BorderLayout.NORTH);//数式を入力するフィールドの設置 50 51 answer = new JTextField(5); 52 answer.setBorder(new TitledBorder("結果")); 53 pane.add(answer, BorderLayout.SOUTH);//計算結果を表示するフィールドの設置 54 55 JPanel leftpanel = new JPanel(); 56 leftpanel.setLayout(new GridLayout(5, 3)); 57 leftpanel.setPreferredSize(new Dimension(270, 400)); 58 59 clear = new JButton(new ClearAction()); 60 leftpanel.add(clear);//クリアボタン 61 62 pm = new JButton(new PmAction()); 63 leftpanel.add(pm);//+-切り替えボタン 64 65 percent = new JButton(new PercentAction()); 66 leftpanel.add(percent);//%表示切り替えボタン 67 68 for (int i = 1; i <= 9; i++) { 69 num = new JButton(new numAction(Integer.toString(i))); 70 leftpanel.add(num); 71 }//1~9の番号ボタン 72 73 del = new JButton(new DelAction()); 74 leftpanel.add(del);//削除ボタン 75 76 zero=new JButton(new ZeroAction()); 77 leftpanel.add(zero); 78 79 pane.add(leftpanel, BorderLayout.CENTER); 80 81 JPanel rightpanel = new JPanel(); 82 rightpanel.setLayout(new GridLayout(5, 1)); 83 84 plus = new JButton(new PlusAction()); 85 rightpanel.add(plus); 86 minus = new JButton(new MinusAction()); 87 rightpanel.add(minus); 88 multiple = new JButton(new MultipleAction()); 89 rightpanel.add(multiple); 90 divide = new JButton(new DivideAction()); 91 rightpanel.add(divide); 92 result = new JButton(new ResultAction()); 93 rightpanel.add(result); 94 95 pane.add(rightpanel, BorderLayout.EAST); 96 input.requestFocus(); // ここでinputに初期フォーカスを設定 97 } 98 99 // Arithmetic Operations 100 class PlusAction extends AbstractAction { 101 PlusAction() { 102 putValue(Action.NAME, "+"); 103 putValue( Action.SHORT_DESCRIPTION, ""); 104 } 105 public void actionPerformed(ActionEvent e) { 106 way.setText("+"); 107 } 108 } 109 110 class MinusAction extends AbstractAction { 111 MinusAction() { 112 putValue(Action.NAME, "-"); 113 } 114 public void actionPerformed(ActionEvent e) { 115 way.setText("-"); 116 } 117 } 118 119 class MultipleAction extends AbstractAction { 120 MultipleAction() { 121 putValue(Action.NAME, "*"); 122 } 123 public void actionPerformed(ActionEvent e) { 124 way.setText("*"); 125 } 126 } 127 128 class DivideAction extends AbstractAction { 129 DivideAction() { 130 putValue(Action.NAME, "/"); 131 } 132 public void actionPerformed(ActionEvent e) { 133 way.setText("/"); 134 } 135 } 136 137 class ResultAction extends AbstractAction { 138 ResultAction() { 139 putValue(Action.NAME, "="); 140 } 141 public void actionPerformed(ActionEvent e) { 142 143 } 144 } 145 146 // Clear button 147 class ClearAction extends AbstractAction { 148 ClearAction() { 149 putValue(Action.NAME, "AC"); 150 } 151 public void actionPerformed(ActionEvent e) { 152 } 153 } 154 155 // Delete last character button 156 class DelAction extends AbstractAction { 157 DelAction() { 158 putValue(Action.NAME, "Del"); 159 } 160 public void actionPerformed(ActionEvent e) { 161 162 } 163 } 164 165 // Plus/Minus action button 166 class PmAction extends AbstractAction { 167 PmAction() { 168 putValue(Action.NAME, "+/-"); 169 } 170 public void actionPerformed(ActionEvent e) { 171 double num = Double.parseDouble(input.getText()); 172 if (currentFocusField == input) { 173 if(input!=null) { 174 String text=input.getText(); 175 num=Double.parseDouble(text); 176 num=-num; 177 String change=String.valueOf(num); 178 input.setText(change); 179 180 } 181 182 } else if (currentFocusField==input2) { 183 if(input2!=null) { 184 String text=input2.getText(); 185 num=Double.parseDouble(text); 186 input2.setText(String.valueOf(-num)); 187 } 188 else { 189 input2.setText(""); 190 } 191 } 192 } 193 } 194 195 class PercentAction extends AbstractAction { 196 double num=0; 197 PercentAction() { 198 putValue(Action.NAME, "%"); 199 } 200 public void actionPerformed(ActionEvent e) { 201 } 202 } 203 204 class numAction extends AbstractAction { 205 String number; 206 numAction(String number) { 207 this.number = number; 208 putValue(Action.NAME, number); 209 } 210 public void actionPerformed(ActionEvent e) { 211 String inputnum=input.getText(); 212 String input2num=input2.getText(); 213 if (currentFocusField == input) { 214 input.setText(inputnum + number); 215 } else if (currentFocusField==input2) { 216 input2.setText(input2num+number); 217 System.out.println(input2num+number); 218 } 219 } 220 } 221 class ZeroAction extends AbstractAction{ 222 ZeroAction() { 223 putValue(Action.NAME, "0"); 224 } 225 public void actionPerformed(ActionEvent e) { 226 } 227 } 228 229 class NumericDocument extends PlainDocument { 230 String validValues = "0123456789.+-%"; 231 232 public void insertString(int offset, String str, AttributeSet a) { 233 if (validValues.indexOf(str) == -1) { 234 return; 235 } 236 try { 237 super.insertString(offset, str, a); 238 } catch (BadLocationException e) { 239 System.out.println(e); 240 } 241 } 242 } 243 244 class NumericDocument2 extends PlainDocument { 245 String validValues = "+-*/%"; 246 247 public void insertString(int offset, String str, AttributeSet a) { 248 if( validValues.indexOf( str ) == -1 ){ 249 return; 250 } 251 try{ 252 super.insertString( offset, str, a ); 253 } 254 catch( BadLocationException e ) { 255 System.out.println( e ); 256 } 257 } 258 259 } 260 261 class NumericDocument3 extends PlainDocument { 262 String validValues = "0123456789.+-"; 263 264 public void insertString(int offset, String str, AttributeSet a) { 265 if( validValues.indexOf( str ) == -1 ){ 266 return; 267 } 268 try{ 269 super.insertString( offset, str, a ); 270 } 271 catch( BadLocationException e ) { 272 System.out.println( e ); 273 } 274 } 275 276 } 277} 278