Guest User

Untitled

a guest
May 20th, 2018
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.28 KB | None | 0 0
  1. /*
  2. * To change this template, choose Tools | Templates
  3. * and open the template in the editor.
  4. */
  5.  
  6. /*
  7. * TextCalcPanel.java
  8. *
  9. * Created on 24.10.2011, 17:57:02
  10. */
  11.  
  12. import java.text.DecimalFormat;
  13. import javax.swing.text.DefaultCaret;
  14.  
  15. /**
  16. *
  17. * @author Thomas Franzke
  18. */
  19. public class TextCalcPanel extends javax.swing.JFrame {
  20.  
  21. //Definition: states for state machine
  22.  
  23. //State where numbers can be entered
  24. private final int STATE_ENTER_NUM = 0;
  25. //State where operators can be entered
  26. private final int STATE_ENTER_OPERATOR = 1;
  27.  
  28. //Definition: operators
  29. private final int OPERATOR_ADD = 0;
  30. private final int OPERATOR_SUB = 1;
  31. private final int OPERATOR_MULT = 2;
  32. private final int OPERATOR_DIV = 3;
  33. private final int OPERATOR_MOD = 4;
  34.  
  35. //Output format for results
  36. private DecimalFormat myDecimalFormat = new DecimalFormat("###############0.00");
  37.  
  38. //Flag that marks if a decimal point may be set
  39. private boolean decimalPointAllowed = true;
  40. //Flag that marks if a sign to a number is allowed
  41. private boolean signAllowed = true;
  42. //The state of the state machine - initial state is waiting for a number
  43. private int state = STATE_ENTER_NUM;
  44. //Number entered as string
  45. private String enteredString = "";
  46. //The last result computed
  47. private double lastResult = 0.00;
  48. //The current entered number
  49. private double currentNumber = 0.00;
  50. //The last entered number
  51. private double lastNumber = 0.00;
  52. //The last used operator - for the first time it will ADD a zero!
  53. private int lastOperator = OPERATOR_ADD;
  54.  
  55. /** Creates new form TextCalcPanel */
  56. public TextCalcPanel() {
  57. initComponents();
  58. //Initial text
  59. calcArea.append("Text based calculator. Version 1.00. \n");
  60. calcArea.append("Please enter your numbers and operators.\n");
  61. calcArea.append("Press RETURN after each number.\n");
  62. calcArea.append("Press 'c' to clear.\n");
  63. calcArea.append("\n| ");
  64. }
  65.  
  66. /** This method is called from within the constructor to
  67. * initialize the form.
  68. * WARNING: Do NOT modify this code. The content of this method is
  69. * always regenerated by the Form Editor.
  70. */
  71. @SuppressWarnings("unchecked")
  72. // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
  73. private void initComponents() {
  74.  
  75. jScrollPane1 = new javax.swing.JScrollPane();
  76. calcArea = new javax.swing.JTextArea();
  77.  
  78. setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
  79. setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
  80. setMinimumSize(new java.awt.Dimension(500, 800));
  81. getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS));
  82.  
  83. calcArea.setColumns(20);
  84. calcArea.setEditable(false);
  85. calcArea.setFont(new java.awt.Font("Courier", 0, 18)); // NOI18N
  86. calcArea.setRows(5);
  87.  
  88. DefaultCaret caret = (DefaultCaret)calcArea.getCaret();
  89. caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
  90.  
  91. calcArea.addKeyListener(new java.awt.event.KeyAdapter() {
  92. public void keyPressed(java.awt.event.KeyEvent evt) {
  93. calcAreaKeyPressed(evt);
  94. }
  95. });
  96. jScrollPane1.setViewportView(calcArea);
  97.  
  98. getContentPane().add(jScrollPane1);
  99. }// </editor-fold>//GEN-END:initComponents
  100.  
  101. //The procedure that is called when a key was pressed
  102. private void calcAreaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_calcAreaKeyPressed
  103.  
  104. //The current pressed key, saved as character
  105. char enteredChar = evt.getKeyChar();
  106.  
  107. //Just check if the pressed key was NO action key, such as DELETE
  108. if (!evt.isActionKey()) {
  109.  
  110. //Your code starts here
  111.  
  112. //Here is the state machine
  113. if (state == STATE_ENTER_NUM) {
  114.  
  115. //Check for numbers
  116. if ( (enteredChar >= '0') &&
  117. (enteredChar <= '9') ) {
  118. signAllowed = false;
  119. enteredString += enteredChar;
  120. calcArea.append(Character.toString(enteredChar));
  121. }
  122.  
  123. //Check for decimal point
  124. if (enteredChar == '.') {
  125. enteredString += enteredChar;
  126. calcArea.append(Character.toString(enteredChar));
  127. }
  128.  
  129. //Check for sign
  130. if (enteredChar == '+')
  131.  
  132.  
  133.  
  134. //Check for carriage return
  135. if (enteredChar == '\n') {
  136. currentNumber = Double.parseDouble(enteredString);
  137.  
  138. if (lastOperator == OPERATOR_ADD) {
  139. lastResult = lastResult + currentNumber;
  140. calcArea.append(" \n| " + "=" + " \n| ");
  141. calcArea.append(lastResult + " \n| ");
  142. enteredString = "";
  143. state = STATE_ENTER_OPERATOR;
  144. }
  145.  
  146. if (lastOperator == OPERATOR_SUB) {
  147. lastResult = lastResult - currentNumber;
  148. calcArea.append(" \n| " + "=" + " \n| ");
  149. calcArea.append(lastResult + " \n| ");
  150. enteredString = "";
  151. state = STATE_ENTER_OPERATOR;
  152. }
  153.  
  154. if (lastOperator == OPERATOR_MULT) {
  155. lastResult = lastResult * currentNumber;
  156. calcArea.append(" \n| " + "=" + " \n| ");
  157. calcArea.append(lastResult + " \n| ");
  158. enteredString = "";
  159. state = STATE_ENTER_OPERATOR;
  160. }
  161.  
  162. if ( (lastOperator == OPERATOR_DIV) &&
  163. ( currentNumber == 0) ) {
  164. lastOperator = OPERATOR_ADD;
  165. lastResult = 0.00;
  166. state = STATE_ENTER_NUM;
  167. calcArea.append(" \n| Math error \n| ");
  168. calcArea.append("Please enter your numbers and operators.\n| ");
  169. calcArea.append("Press RETURN after each number.\n| ");
  170. }
  171.  
  172. if ( (lastOperator == OPERATOR_DIV) &&
  173. ( currentNumber != 0) ) {
  174. lastResult = lastResult / currentNumber;
  175. calcArea.append(" \n| " + "=" + " \n| ");
  176. calcArea.append(lastResult + " \n| ");
  177. enteredString = "";
  178. state = STATE_ENTER_OPERATOR;
  179. }
  180.  
  181.  
  182. if (lastOperator == OPERATOR_MOD) {
  183. lastResult = lastResult % currentNumber;
  184. calcArea.append(" \n| " + "=" + " \n| ");
  185. calcArea.append(lastResult + " \n| ");
  186. enteredString = "";
  187. state = STATE_ENTER_OPERATOR;
  188. }
  189.  
  190. }
  191.  
  192. }
  193.  
  194. else if (state == STATE_ENTER_OPERATOR) {
  195.  
  196. //Operator add
  197. if (enteredChar == '+') {
  198. lastOperator = OPERATOR_ADD;
  199. state = STATE_ENTER_NUM;
  200. calcArea.append("+\n| ");
  201. }
  202.  
  203. //Operator subtract
  204. if (enteredChar == '-') {
  205. lastOperator = OPERATOR_SUB;
  206. state = STATE_ENTER_NUM;
  207. calcArea.append("-\n| ");
  208. }
  209.  
  210. //Operator multiply
  211. if (enteredChar == '*') {
  212. lastOperator = OPERATOR_MULT;
  213. state = STATE_ENTER_NUM;
  214. calcArea.append("*\n| ");
  215.  
  216. }
  217.  
  218. //Operator divide
  219. if (enteredChar == '/') {
  220. lastOperator = OPERATOR_DIV;
  221. state = STATE_ENTER_NUM;
  222. calcArea.append("/\n| ");
  223. }
  224.  
  225. //Operator modulo
  226. if (enteredChar == '%') {
  227. lastOperator = OPERATOR_MOD;
  228. state = STATE_ENTER_NUM;
  229. calcArea.append("%\n| ");
  230. }
  231.  
  232. //Clear everything
  233. if (enteredChar == 'c') {
  234. lastOperator = OPERATOR_ADD;
  235. lastResult = 0.00;
  236. state = STATE_ENTER_NUM;
  237. calcArea.append("Please enter your numbers and operators.\n| ");
  238. calcArea.append("Press RETURN after each number.\n| ");
  239. }
  240.  
  241. //Check for carriage return and no operator was entered
  242. if (enteredChar == '\n') {
  243. state = STATE_ENTER_OPERATOR;
  244. calcArea.append("Please enter operator.\n| ");
  245. }
  246.  
  247. }
  248.  
  249. //Your code ends here
  250.  
  251. //Shall not be - except the state has a wrong value
  252. else {
  253. calcArea.append("Inner state machine collapsed! Programming fault!\n");
  254. }
  255.  
  256. }
  257. else {
  258. //Make a noise
  259. java.awt.Toolkit tk = this.getToolkit();
  260. tk.beep();
  261. }
  262.  
  263. }//GEN-LAST:event_calcAreaKeyPressed
  264.  
  265. public static void main(String[] args) {
  266.  
  267. TextCalcPanel tcp = new TextCalcPanel();
  268. tcp.setVisible(true);
  269. }
  270.  
  271. // Variables declaration - do not modify//GEN-BEGIN:variables
  272. private javax.swing.JTextArea calcArea;
  273. private javax.swing.JScrollPane jScrollPane1;
  274. // End of variables declaration//GEN-END:variables
  275. }
Add Comment
Please, Sign In to add comment