Rabu, 18 Januari 2012

Source code Calculator Java



import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Calculator extends JFrame implements ActionListener{
                // Variabel
                final int MAX_INPUT_LENGTH = 35;
                final int INPUT_MODE = 0;
                final int RESULT_MODE = 1;
                final int ERROR_MODE = 2;
                int displayMode;

                boolean clearOnNextDigit, percent;
                double lastNumber;
                String lastOperator;

                private JMenu jmenuFile, jmenuHelp;
                private JMenuItem jmenuitemExit, jmenuitemAbout;

                private JLabel jlbOutput;
                private JButton jbnButtons[];
                private JPanel jplMaster, jplBackSpace, jplControl;
                /*
                 * membuat font dari spesifikasi nama, style
                 */

                Font f12 = new Font("Times New Roman", 0, 12);
                Font f121 = new Font("Times New Roman", 1, 12);

                // konstruksi kalkulator
                public Calculator()
                {
jmenuFile = new JMenu("Program");
                                jmenuFile.setFont(f121);
                                jmenuFile.setMnemonic(KeyEvent.VK_F);

                                jmenuitemExit = new JMenuItem("Keluar");
                                jmenuitemExit.setFont(f12);
                                jmenuitemExit.setAccelerator(KeyStroke.getKeyStroke( KeyEvent.VK_X,
                                                                               
ActionEvent.CTRL_MASK));
                                jmenuFile.add(jmenuitemExit);

jmenuHelp = new JMenu("Bantuan");
                                jmenuHelp.setFont(f121);
                                jmenuHelp.setMnemonic(KeyEvent.VK_H);

                                jmenuitemAbout = new JMenuItem("Tentang Kalkulator");
                                jmenuitemAbout.setFont(f12);
                                jmenuHelp.add(jmenuitemAbout);

                                JMenuBar mb = new JMenuBar();
                                mb.add(jmenuFile);
                                mb.add(jmenuHelp);
                                setJMenuBar(mb);

//membuat frame
setBackground(Color.black);

                                jplMaster = new JPanel();

                                jlbOutput = new JLabel(" 0");
                                jlbOutput.setHorizontalTextPosition(JLabel.RIGHT);
                                jlbOutput.setBackground(Color.white);
                                jlbOutput.setOpaque(true);

                                // menambahkan komponen frame
                                getContentPane().add(jlbOutput, BorderLayout.NORTH);

                                jbnButtons = new JButton[23];
                                //GridLayout(int rows, int cols, int hgap, int vgap)

                                JPanel jplButtons = new JPanel();// container for Jbuttons

                                // membuat angka numeric
                                for (int i=0; i<=9; i++)
                                {
                                                // set each Jbutton label to the value of index
                                                jbnButtons[i] = new JButton(String.valueOf(i));
                                }

                                // membuat operator
                                jbnButtons[10] = new JButton("+/-");
                                jbnButtons[11] = new JButton(".");
                                jbnButtons[12] = new JButton("=");
                                jbnButtons[13] = new JButton("/");
                                jbnButtons[14] = new JButton("*");
                                jbnButtons[15] = new JButton("-");
                                jbnButtons[16] = new JButton("+");
                                jbnButtons[17] = new JButton("Akar");
                                jbnButtons[18] = new JButton("1/x");
                                jbnButtons[19] = new JButton("%");

                                jplBackSpace = new JPanel();
                                jplBackSpace.setLayout(new GridLayout(1, 1, 2, 2));

                                jbnButtons[20] = new JButton("Hapus");
                                jplBackSpace.add(jbnButtons[20]);

                                jplControl = new JPanel();
                                jplControl.setLayout(new GridLayout(1, 2, 2 ,2));

                                jbnButtons[21] = new JButton("  CE  ");
                                jbnButtons[22] = new JButton("C");

                                jplControl.add(jbnButtons[21]);
                                jplControl.add(jbnButtons[22]);

                                //Setting warna tombol
                                for (int i=0; i      {
                                                jbnButtons[i].setFont(f12);

                                                if (i<10)
                                                                jbnButtons[i].setForeground(Color.black);

                                                else
                                                                jbnButtons[i].setForeground(Color.RED);
                                }

                                // Set panel layout manager
                                jplButtons.setLayout(new GridLayout(4, 5, 2, 2));

                                //Add buttons to keypad panel starting at top left
                                // First row
                                for(int i=7; i<=9; i++)                       {
                                                jplButtons.add(jbnButtons[i]);
                                }

                                // add button / and sqrt
                                jplButtons.add(jbnButtons[13]);
                                jplButtons.add(jbnButtons[17]);

                                // Second row
                                for(int i=4; i<=6; i++)
                                {
                                                jplButtons.add(jbnButtons[i]);
                                }
                                // add button * and x^2
                                jplButtons.add(jbnButtons[14]);
                                jplButtons.add(jbnButtons[18]);

                                // Third row
                                for( int i=1; i<=3; i++)
                                {
                                                jplButtons.add(jbnButtons[i]);
                                }

                                //adds button - and %
                                jplButtons.add(jbnButtons[15]);
                                jplButtons.add(jbnButtons[19]);

                                //Fourth Row
                                // add 0, +/-, ., +, and =
                                jplButtons.add(jbnButtons[0]);
                                jplButtons.add(jbnButtons[10]);
                                jplButtons.add(jbnButtons[11]);
                                jplButtons.add(jbnButtons[16]);
                                jplButtons.add(jbnButtons[12]);

                                jplMaster.setLayout(new BorderLayout());
                                jplMaster.add(jplBackSpace, BorderLayout.CENTER);
                                jplMaster.add(jplControl, BorderLayout.EAST);
                                jplMaster.add(jplButtons, BorderLayout.SOUTH);

                                // Add components to frame
                                getContentPane().add(jplMaster, BorderLayout.SOUTH);
                                requestFocus();

                                //activate ActionListener
                                for (int i=0; i
                                                jbnButtons[i].addActionListener(this);
                                }

                                jmenuitemAbout.addActionListener(this);
                                jmenuitemExit.addActionListener(this);

                                clearAll();

                                //add WindowListener for closing frame and ending program
                                addWindowListener(new WindowAdapter() {

                                                                public void windowClosed(WindowEvent e){
                                                                                System.exit(0);
                                                                }
                                                }
                                );
                                this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                }              //End of Contructor Calculator

                // Perform action
                public void actionPerformed(ActionEvent e){
                                double result = 0;

                                if(e.getSource() == jmenuitemAbout){
                                                JDialog dlgAbout = new CustomABOUTDialog(this, "Tentang Kalkulator", true);
                                                dlgAbout.setVisible(true);
                                }else if(e.getSource() == jmenuitemExit){
                                                System.exit(0);
                                }

                                // Search for the button pressed until end of array or key found
                                for (int i=0; i
                                {
                                                if(e.getSource() == jbnButtons[i])
                                                {
                                                                switch(i)
                                                                {
                                                                                case 0:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 1:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 2:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 3:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 4:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 5:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 6:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 7:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 8:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 9:
                                                                                                addDigitToDisplay(i);
                                                                                                break;

                                                                                case 10:                // +/-
                                                                                                processSignChange();
                                                                                                break;

                                                                                case 11:                // decimal point
                                                                                                addDecimalPoint();
                                                                                                break;

                                                                                case 12:                // =
                                                                                                processEquals();
                                                                                                break;

                                                                                case 13:                // divide
                                                                                                processOperator("/");
                                                                                                break;

                                                                                case 14:                // *
                                                                                                processOperator("*");
                                                                                                break;

                                                                                case 15:                // -
                                                                                                processOperator("-");
                                                                                                break;

                                                                                case 16:                // +
                                                                                                processOperator("+");
                                                                                                break;

                                                                                case 17:                // sqrt
                                                                                                if (displayMode != ERROR_MODE)
                                                                                                {
                                                                                                                try
                                                                                                                {
                                                                if (getDisplayString().indexOf("-") == 0)
                                                                displayError("Invalid input for function!");

                                                                result = Math.sqrt(getNumberInDisplay());
                                                                                                                                displayResult(result);
                                                                                                                }

                                                                                                                catch(Exception ex)
                                                                                                                {
                                                                                                                displayError("Invalid input for function!");
                                                                                                                                displayMode = ERROR_MODE;
                                                                                                                }
                                                                                                }
                                                                                                break;

                                                                                case 18:                // 1/x
                                                                                                if (displayMode != ERROR_MODE){
                                                                                                                try
                                                                                                                {
                                                                                                if (getNumberInDisplay() == 0)
                                                                                                displayError("Tidak dapat dibagi 0!");

                                                                                                                                result = 1 / getNumberInDisplay();
                                                                                                                                displayResult(result);
                                                                                                                }

                                                                                                                catch(Exception ex)        {
                                                                                                                                displayError("Tidak dapat dibagi 0!");
                                                                                                                                displayMode = ERROR_MODE;
                                                                                                                }
                                                                                                }
                                                                                                break;

                                                                                case 19:                // %
                                                                                                if (displayMode != ERROR_MODE){
                                                                                                                try          {
                                                                                                                                result = getNumberInDisplay() / 100;
                                                                                                                                displayResult(result);
                                                                                                                }

                                                                                                                catch(Exception ex)        {
                                                                                                                displayError("Invalid input for function!");
                                                                                                                                displayMode = ERROR_MODE;
                                                                                                                }
                                                                                                }
                                                                                                break;

                                                                                case 20:                // backspace
                                                                                                if (displayMode != ERROR_MODE){
                                                                                                                setDisplayString(getDisplayString().substring(0,
                                                                                                                                                                getDisplayString().length() - 1));

                                                                                                                if (getDisplayString().length() < 1)
                                                                                                                                setDisplayString("0");
                                                                                                }
                                                                                                break;

                                                                                case 21:                // CE
                                                                                                clearExisting();
                                                                                                break;

                                                                                case 22:                // C
                                                                                                clearAll();
                                                                                                break;
                                                                }
                                                }
                                }
                }

                void setDisplayString(String s){
                                jlbOutput.setText(s);
                }

                String getDisplayString (){
                                return jlbOutput.getText();
                }

                void addDigitToDisplay(int digit){
                                if (clearOnNextDigit)
                                                setDisplayString("");

                                String inputString = getDisplayString();

                                if (inputString.indexOf("0") == 0){
                                                inputString = inputString.substring(1);
                                }

                                if ((!inputString.equals("0") || digit > 0)  && inputString.length() < MAX_INPUT_LENGTH){
                                                setDisplayString(inputString + digit);
                                }


                                displayMode = INPUT_MODE;
                                clearOnNextDigit = false;
                }

                void addDecimalPoint(){
                                displayMode = INPUT_MODE;

                                if (clearOnNextDigit)
                                                setDisplayString("");

                                String inputString = getDisplayString();

                                // If the input string already contains a decimal point, don't
                                //  do anything to it.
                                if (inputString.indexOf(".") < 0)
                                                setDisplayString(new String(inputString + "."));
                }

                void processSignChange(){
                                if (displayMode == INPUT_MODE)
                                {
                                                String input = getDisplayString();

                                                if (input.length() > 0 && !input.equals("0"))
                                                {
                                                                if (input.indexOf("-") == 0)
                                                                                setDisplayString(input.substring(1));

                                                                else
                                                                                setDisplayString("-" + input);
                                                }

                                }

                                else if (displayMode == RESULT_MODE)
                                {
                                                double numberInDisplay = getNumberInDisplay();

                                                if (numberInDisplay != 0)
                                                                displayResult(-numberInDisplay);
                                }
                }

                void clearAll()    {
                                setDisplayString(" 0");
                                lastOperator = " 0";
                                lastNumber = 0;
                                displayMode = INPUT_MODE;
                                clearOnNextDigit = true;
                }

                void clearExisting(){
                                setDisplayString(" 0");
                                clearOnNextDigit = true;
                                displayMode = INPUT_MODE;
                }
double getNumberInDisplay()   {
                                String input = jlbOutput.getText();
                                return Double.parseDouble(input);}
void processOperator(String op) {
                                if (displayMode != ERROR_MODE)
                                {
                                                double numberInDisplay = getNumberInDisplay();

                                                if (!lastOperator.equals(" 0"))
                                                {
                                                                try
                                                                {
                                                                                double result = processLastOperator();
                                                                                displayResult(result);
                                                                                lastNumber = result;
                                                                }

                                                                catch (DivideByZeroException e)
                                                                {
                                                                }
                                                }

                                                else
                                                {
                                                                lastNumber = numberInDisplay;
                                                }

                                                clearOnNextDigit = true;
                                                lastOperator = op;
                                }
                }

                void processEquals(){
                                double result = 0;

                                if (displayMode != ERROR_MODE){
                                                try
                                                {
                                                                result = processLastOperator();
                                                                displayResult(result);
                                                }

                                                catch (DivideByZeroException e)              {
                                                                displayError("Tidak dapat dibagi 0!");
                                                }

                                                lastOperator = " 0";
                                }
                }

                double processLastOperator() throws DivideByZeroException {
                                double result = 0;
                                double numberInDisplay = getNumberInDisplay();

                                if (lastOperator.equals("/"))
                                {
                                                if (numberInDisplay == 0)
                                                                throw (new DivideByZeroException());

                                                result = lastNumber / numberInDisplay;
                                }

                                if (lastOperator.equals("*"))
                                                result = lastNumber * numberInDisplay;

                                if (lastOperator.equals("-"))
                                                result = lastNumber - numberInDisplay;

                                if (lastOperator.equals("+"))
                                                result = lastNumber + numberInDisplay;

                                return result;
                }

                void displayResult(double result){
                                setDisplayString(Double.toString(result));
                                lastNumber = result;
                                displayMode = RESULT_MODE;
                                clearOnNextDigit = true;
                }

                void displayError(String errorMessage){
                                setDisplayString(errorMessage);
                                lastNumber = 0;
                                displayMode = ERROR_MODE;
                                clearOnNextDigit = true;
                }

                public static void main(String args[]) {
                                Calculator calci = new Calculator();
                                Container contentPane = calci.getContentPane();
//                            contentPane.setLayout(new BorderLayout());
                                calci.setTitle("Kalkulator v 1.0");
                                calci.pack();
                                calci.setLocation(200, 250);
                                calci.setVisible(true);
                                calci.setResizable(true);
                }

}                              //End of Swing Calculator Class.

class DivideByZeroException extends Exception{
                public DivideByZeroException()
                {
                                super();
                }

                public DivideByZeroException(String s)
                {
                                super(s);
                }
}

class CustomABOUTDialog extends JDialog implements ActionListener {
                JButton jbnOk;

                CustomABOUTDialog(JFrame parent, String title, boolean modal){
                                super(parent, title, modal);
                                setBackground(Color.black);

                JPanel p1 = new JPanel(new FlowLayout(FlowLayout.CENTER));

                                StringBuffer text = new StringBuffer();

        text.append(" Pengedit :     Muhammad Nurhidayat Sa'bani \n");
                    text.append("                              2 TKJ 2\n");

   JTextArea jtAreaAbout = new JTextArea(0, 26);
                                jtAreaAbout.setText(text.toString());
                                jtAreaAbout.setFont(new Font("Times New Roman", 0, 15));
                                jtAreaAbout.setEditable(false);

                                p1.add(jtAreaAbout);
                                p1.setBackground(Color.blue);
                                getContentPane().add(p1, BorderLayout.CENTER);

                                JPanel p2 = new JPanel(new FlowLayout(FlowLayout.CENTER));
                                jbnOk = new JButton(" OK ");
                                jbnOk.addActionListener(this);

                                p2.add(jbnOk);
                                getContentPane().add(p2, BorderLayout.SOUTH);

                                setLocation(408, 300);
                                setResizable(false);

                                addWindowListener(new WindowAdapter() {
                                                                public void windowClosing(WindowEvent e)
                                                                {
                                                                                Window aboutDialog = e.getWindow();
                                                                                aboutDialog.dispose();
                                                                }
                                                }
                                );

                                pack();
                }

                public void actionPerformed(ActionEvent e)
                {
                                if(e.getSource() == jbnOk)          {
                                                this.dispose();
                                }
                }

}



0 komentar: