This code for a basic calculator
I have 2 problems:
- How to get correct result for percentage calculation?
- And set limit for text field?
I need text field to only read 16 digits maximum.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
public class Calculator extends JFrame implements ActionListener {
private static final long serialVersionUID = 4055065492318058414L;
private JPanel northPanel;
private JPanel centerPanel;
private JTextField field;
private JButton b1;
private JButton b2;
private JButton b3;
private JButton b4;
private JButton b5;
private JButton b6;
private JButton b7;
private JButton b8;
private JButton b9;
private JButton b0;
private JButton bPlus;
private JButton bMine;
private JButton bMultiple;
private JButton bDivision;
private JButton bEqual;
private JButton bClear;
private JButton bErase;
private JButton bPercent;
private JButton bPlusMine;
private JButton bDot;
private double fNum;
private double sNum;
private double result;
private String operation;
private static final Font fontButton = new Font("Consolas", Font.BOLD, 20);
public static void main(String[] args) {
new Calculator().setVisible(true);
}
public Calculator() {
super("Calculator");
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
setSize(225, 300);
setLocationRelativeTo(null);
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setGUI();
} catch (Exception e) {
e.printStackTrace();
}
}
private void setGUI() {
northPanel = new JPanel();
add(northPanel, BorderLayout.NORTH);
centerPanel = new JPanel();
add(centerPanel, BorderLayout.CENTER);
field = new JTextField(10);
field.setEnabled(false);
field.setHorizontalAlignment(JTextField.RIGHT);
field.setDisabledTextColor(Color.BLACK);
field.setBackground(Color.WHITE);
field.setFont(new Font("Consolas", Font.BOLD, 32));
northPanel.add(field);
bErase = new JButton("<");
bErase.setFont(fontButton);
bPlus = new JButton("+");
bPlus.setFont(fontButton);
bPercent = new JButton("%");
bPercent.setFont(fontButton);
bMine = new JButton("-");
bMine.setFont(fontButton);
bMultiple = new JButton("\u00D7");
bMultiple.setFont(fontButton);
bDivision = new JButton("\u00F7");
bDivision.setFont(fontButton);
bEqual = new JButton("=");
bEqual.setFont(fontButton);
bClear = new JButton("c");
bClear.setFont(fontButton);
bPlusMine = new JButton("±");
bPlusMine.setFont(fontButton);
bDot = new JButton(".");
bDot.setFont(fontButton);
b1 = new JButton("1");
b1.setFont(fontButton);
b2 = new JButton("2");
b2.setFont(fontButton);
b3 = new JButton("3");
b3.setFont(fontButton);
b4 = new JButton("4");
b4.setFont(fontButton);
b5 = new JButton("5");
b5.setFont(fontButton);
b6 = new JButton("6");
b6.setFont(fontButton);
b7 = new JButton("7");
b7.setFont(fontButton);
b8 = new JButton("8");
b8.setFont(fontButton);
b9 = new JButton("9");
b9.setFont(fontButton);
bDot = new JButton(".");
bDot.setFont(fontButton);
b0 = new JButton("0");
b0.setFont(fontButton);
centerPanel.add(bErase);
centerPanel.add(bClear);
centerPanel.add(bPercent);
centerPanel.add(bDivision);
centerPanel.add(b1);
centerPanel.add(b2);
centerPanel.add(b3);
centerPanel.add(bMultiple);
centerPanel.add(b4);
centerPanel.add(b5);
centerPanel.add(b6);
centerPanel.add(bMine);
centerPanel.add(b7);
centerPanel.add(b8);
centerPanel.add(b9);
centerPanel.add(bPlus);
centerPanel.add(bPlusMine);
centerPanel.add(b0);
centerPanel.add(bDot);
centerPanel.add(bEqual);
b1.addActionListener(this);
b2.addActionListener(this);
b3.addActionListener(this);
b4.addActionListener(this);
b5.addActionListener(this);
b6.addActionListener(this);
b7.addActionListener(this);
b8.addActionListener(this);
b9.addActionListener(this);
b0.addActionListener(this);
bDot.addActionListener(this);
bClear.addActionListener(this);
bErase.addActionListener(this);
bPlus.addActionListener(this);
bMine.addActionListener(this);
bMultiple.addActionListener(this);
bDivision.addActionListener(this);
bPlusMine.addActionListener(this);
bPercent.addActionListener(this);
bEqual.addActionListener(this);
field.addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent event) {
if (field.getText().length() >= 10)
field.setFont(new Font("Consolas", Font.BOLD, 25));
if (field.getText().length() >= 13)
field.setFont(new Font("Consolas", Font.BOLD, 20));
if (field.getText().length() >= 15)
field.setFont(new Font("Consolas", Font.BOLD, 19));
}
});
}
public void actionPerformed(ActionEvent event) {
if (event.getSource().equals(b1))
field.setText(field.getText() + "1");
if (event.getSource().equals(b2))
field.setText(field.getText() + "2");
if (event.getSource().equals(b3))
field.setText(field.getText() + "3");
if (event.getSource().equals(b4))
field.setText(field.getText() + "4");
if (event.getSource().equals(b5))
field.setText(field.getText() + "5");
if (event.getSource().equals(b6))
field.setText(field.getText() + "6");
if (event.getSource().equals(b7))
field.setText(field.getText() + "7");
if (event.getSource().equals(b8))
field.setText(field.getText() + "8");
if (event.getSource().equals(b9))
field.setText(field.getText() + "9");
if (event.getSource().equals(bDot)) {
if (field.getText().indexOf(".") == -1 && !field.getText().isEmpty())
field.setText(field.getText() + ".");
}
if (event.getSource().equals(b0)) {
/*
* if (field.getText().isEmpty()) field.setText("");
*
* else
*/
field.setText(field.getText() + "0");
}
if (event.getSource().equals(bClear)) {
if (!field.getText().isEmpty()) {
fNum = 0;
sNum = 0;
operation = null;
field.setText(null);
}
}
if (event.getSource().equals(bErase)) {
if (!field.getText().isEmpty())
field.setText(field.getText().substring(0, field.getText().length() - 1));
}
if (event.getSource().equals(bPlus)) {
if (!field.getText().isEmpty()) {
fNum = Double.valueOf(field.getText());
field.setText(null);
operation = "+";
}
}
if (event.getSource().equals(bMine)) {
if (!field.getText().isEmpty()) {
fNum = Double.valueOf(field.getText());
field.setText(null);
operation = "-";
}
}
if (event.getSource().equals(bMultiple)) {
if (!field.getText().isEmpty()) {
fNum = Double.valueOf(field.getText());
field.setText(null);
operation = "\u00D7";
}
}
if (event.getSource().equals(bDivision)) {
if (!field.getText().isEmpty()) {
fNum = Double.valueOf(field.getText());
field.setText(null);
operation = "\u00F7";
}
}
if (event.getSource().equals(bEqual)) {
if (!field.getText().isEmpty() && operation != null) {
sNum = Double.valueOf(field.getText());
if (operation.equals("+"))
result = fNum + sNum;
else if (operation.equals("-"))
result = fNum - sNum;
else if (operation.equals("x"))
result = fNum * sNum;
else if (operation.equals("\u00F7"))
result = fNum / sNum;
else if (operation.equals("\u00D7"))
result = fNum * sNum;
field.setText(String.valueOf(result));
}
}
if (event.getSource().equals(bPlusMine)) {
if (!field.getText().isEmpty()) {
double num = Double.valueOf(field.getText());
if (num > 0)
field.setText(String.valueOf(num - (num * 2)));
else
field.setText(String.valueOf(Math.abs(num)));
}
}
}
}
For text field limit, I wrote this code in actionPerformed
method
if (event.getSource().equals(bPlusMine)) {
if (field.getText().length() > 16)
field.setText(field.getText().substring(0, 16));
}
But the above code does not work and I can't use keyListener because textfield is disabled and can only get value from buttons