Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this template, choose Tools | Templates
- * and open the template in the editor.
- */
- /*
- * TextCalcPanel.java
- *
- * Created on 24.10.2011, 17:57:02
- */
- import java.text.DecimalFormat;
- import javax.swing.text.DefaultCaret;
- /**
- *
- * @author Thomas Franzke
- */
- public class TextCalcPanel extends javax.swing.JFrame {
- //Definition: states for state machine
- //State where numbers can be entered
- private final int STATE_ENTER_NUM = 0;
- //State where operators can be entered
- private final int STATE_ENTER_OPERATOR = 1;
- //Definition: operators
- private final int OPERATOR_ADD = 0;
- private final int OPERATOR_SUB = 1;
- private final int OPERATOR_MULT = 2;
- private final int OPERATOR_DIV = 3;
- private final int OPERATOR_MOD = 4;
- //Output format for results
- private DecimalFormat myDecimalFormat = new DecimalFormat("###############0.00");
- //Flag that marks if a decimal point may be set
- private boolean decimalPointAllowed = true;
- //Flag that marks if a sign to a number is allowed
- private boolean signAllowed = true;
- //The state of the state machine - initial state is waiting for a number
- private int state = STATE_ENTER_NUM;
- //Number entered as string
- private String enteredString = "";
- //The last result computed
- private double lastResult = 0.00;
- //The current entered number
- private double currentNumber = 0.00;
- //The last entered number
- private double lastNumber = 0.00;
- //The last used operator - for the first time it will ADD a zero!
- private int lastOperator = OPERATOR_ADD;
- /** Creates new form TextCalcPanel */
- public TextCalcPanel() {
- initComponents();
- //Initial text
- calcArea.append("Text based calculator. Version 1.00. \n");
- calcArea.append("Please enter your numbers and operators.\n");
- calcArea.append("Press RETURN after each number.\n");
- calcArea.append("Press 'c' to clear.\n");
- calcArea.append("\n| ");
- }
- /** This method is called from within the constructor to
- * initialize the form.
- * WARNING: Do NOT modify this code. The content of this method is
- * always regenerated by the Form Editor.
- */
- @SuppressWarnings("unchecked")
- // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
- private void initComponents() {
- jScrollPane1 = new javax.swing.JScrollPane();
- calcArea = new javax.swing.JTextArea();
- setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
- setCursor(new java.awt.Cursor(java.awt.Cursor.DEFAULT_CURSOR));
- setMinimumSize(new java.awt.Dimension(500, 800));
- getContentPane().setLayout(new javax.swing.BoxLayout(getContentPane(), javax.swing.BoxLayout.LINE_AXIS));
- calcArea.setColumns(20);
- calcArea.setEditable(false);
- calcArea.setFont(new java.awt.Font("Courier", 0, 18)); // NOI18N
- calcArea.setRows(5);
- DefaultCaret caret = (DefaultCaret)calcArea.getCaret();
- caret.setUpdatePolicy(DefaultCaret.ALWAYS_UPDATE);
- calcArea.addKeyListener(new java.awt.event.KeyAdapter() {
- public void keyPressed(java.awt.event.KeyEvent evt) {
- calcAreaKeyPressed(evt);
- }
- });
- jScrollPane1.setViewportView(calcArea);
- getContentPane().add(jScrollPane1);
- }// </editor-fold>//GEN-END:initComponents
- //The procedure that is called when a key was pressed
- private void calcAreaKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_calcAreaKeyPressed
- //The current pressed key, saved as character
- char enteredChar = evt.getKeyChar();
- //Just check if the pressed key was NO action key, such as DELETE
- if (!evt.isActionKey()) {
- //Your code starts here
- //Here is the state machine
- if (state == STATE_ENTER_NUM) {
- //Check for numbers
- if ( (enteredChar >= '0') &&
- (enteredChar <= '9') ) {
- signAllowed = false;
- enteredString += enteredChar;
- calcArea.append(Character.toString(enteredChar));
- }
- //Check for decimal point
- if (enteredChar == '.') {
- enteredString += enteredChar;
- calcArea.append(Character.toString(enteredChar));
- }
- //Check for sign
- if (enteredChar == '+')
- //Check for carriage return
- if (enteredChar == '\n') {
- currentNumber = Double.parseDouble(enteredString);
- if (lastOperator == OPERATOR_ADD) {
- lastResult = lastResult + currentNumber;
- calcArea.append(" \n| " + "=" + " \n| ");
- calcArea.append(lastResult + " \n| ");
- enteredString = "";
- state = STATE_ENTER_OPERATOR;
- }
- if (lastOperator == OPERATOR_SUB) {
- lastResult = lastResult - currentNumber;
- calcArea.append(" \n| " + "=" + " \n| ");
- calcArea.append(lastResult + " \n| ");
- enteredString = "";
- state = STATE_ENTER_OPERATOR;
- }
- if (lastOperator == OPERATOR_MULT) {
- lastResult = lastResult * currentNumber;
- calcArea.append(" \n| " + "=" + " \n| ");
- calcArea.append(lastResult + " \n| ");
- enteredString = "";
- state = STATE_ENTER_OPERATOR;
- }
- if ( (lastOperator == OPERATOR_DIV) &&
- ( currentNumber == 0) ) {
- lastOperator = OPERATOR_ADD;
- lastResult = 0.00;
- state = STATE_ENTER_NUM;
- calcArea.append(" \n| Math error \n| ");
- calcArea.append("Please enter your numbers and operators.\n| ");
- calcArea.append("Press RETURN after each number.\n| ");
- }
- if ( (lastOperator == OPERATOR_DIV) &&
- ( currentNumber != 0) ) {
- lastResult = lastResult / currentNumber;
- calcArea.append(" \n| " + "=" + " \n| ");
- calcArea.append(lastResult + " \n| ");
- enteredString = "";
- state = STATE_ENTER_OPERATOR;
- }
- if (lastOperator == OPERATOR_MOD) {
- lastResult = lastResult % currentNumber;
- calcArea.append(" \n| " + "=" + " \n| ");
- calcArea.append(lastResult + " \n| ");
- enteredString = "";
- state = STATE_ENTER_OPERATOR;
- }
- }
- }
- else if (state == STATE_ENTER_OPERATOR) {
- //Operator add
- if (enteredChar == '+') {
- lastOperator = OPERATOR_ADD;
- state = STATE_ENTER_NUM;
- calcArea.append("+\n| ");
- }
- //Operator subtract
- if (enteredChar == '-') {
- lastOperator = OPERATOR_SUB;
- state = STATE_ENTER_NUM;
- calcArea.append("-\n| ");
- }
- //Operator multiply
- if (enteredChar == '*') {
- lastOperator = OPERATOR_MULT;
- state = STATE_ENTER_NUM;
- calcArea.append("*\n| ");
- }
- //Operator divide
- if (enteredChar == '/') {
- lastOperator = OPERATOR_DIV;
- state = STATE_ENTER_NUM;
- calcArea.append("/\n| ");
- }
- //Operator modulo
- if (enteredChar == '%') {
- lastOperator = OPERATOR_MOD;
- state = STATE_ENTER_NUM;
- calcArea.append("%\n| ");
- }
- //Clear everything
- if (enteredChar == 'c') {
- lastOperator = OPERATOR_ADD;
- lastResult = 0.00;
- state = STATE_ENTER_NUM;
- calcArea.append("Please enter your numbers and operators.\n| ");
- calcArea.append("Press RETURN after each number.\n| ");
- }
- //Check for carriage return and no operator was entered
- if (enteredChar == '\n') {
- state = STATE_ENTER_OPERATOR;
- calcArea.append("Please enter operator.\n| ");
- }
- }
- //Your code ends here
- //Shall not be - except the state has a wrong value
- else {
- calcArea.append("Inner state machine collapsed! Programming fault!\n");
- }
- }
- else {
- //Make a noise
- java.awt.Toolkit tk = this.getToolkit();
- tk.beep();
- }
- }//GEN-LAST:event_calcAreaKeyPressed
- public static void main(String[] args) {
- TextCalcPanel tcp = new TextCalcPanel();
- tcp.setVisible(true);
- }
- // Variables declaration - do not modify//GEN-BEGIN:variables
- private javax.swing.JTextArea calcArea;
- private javax.swing.JScrollPane jScrollPane1;
- // End of variables declaration//GEN-END:variables
- }
Add Comment
Please, Sign In to add comment