The interface of this calculator imitates the simple calculator that comes with Windows, including the interactive interface and responses to various inputs. The functions of the menu bar and memory buttons have not been implemented yet.
Copy the code code as follows:
import java.awt.Color;
import java.awt.Container;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.JButton;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.SwingConstants;
import javax.swing.plaf.basic.BasicBorders;
public class Calculator extends JFrame {
private static final long serialVersionUID = 1L;
Container c = getContentPane();
StringBuilder number1 = new StringBuilder("");//Storage the first number string
StringBuilder number2 = new StringBuilder("");//Storage the second numeric string
StringBuilder operator = new StringBuilder("");//Storage operator
StringBuilder result = new StringBuilder("");//Storage operation result
JTextField numbershow = new JTextField("0.");//Number display area, the initial display is "0."
public static void main(String[] args) {//main method
Calculator c1 = new Calculator();
c1.setVisible(true);
}
public Calculator() {// Calculator construction method
setTitle("Calculator");
setBounds(100, 100, 260, 245);
setResizable(false);
setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
createMenuBar();//Create menu bar
createNumberShow();//Create a number display area
createMemoShow();//Create memory display
createClearButtons();//Create three buttons such as Backspace, CE, and C
createButtonArea();//Create a number button area
}
private void createMenuBar() {//Method to create menu bar
JMenuBar menubar = new JMenuBar();
setJMenuBar(menubar);
JMenu menu1 = new JMenu("Edit");
JMenu menu2 = new JMenu("View");
JMenu menu3 = new JMenu("Help");
menubar.add(menu1);
menubar.add(menu2);
menubar.add(menu3);
JMenuItem menu1item1 = new JMenuItem("Copy");
JMenuItem menu1item2 = new JMenuItem("Paste");
JMenuItem menu2item1 = new JMenuItem("standard type");
JMenuItem menu2item2 = new JMenuItem("Scientific");
JMenuItem menu2item3 = new JMenuItem("Scientific Grouping");
JMenuItem menu3item1 = new JMenuItem("Help Topic");
JMenuItem menu3item2 = new JMenuItem("About Calculator");
menu1.add(menu1item1);
menu1.add(menu1item2);
menu2.add(menu2item1);
menu2.add(menu2item2);
menu2.add(menu2item3);
menu3.add(menu3item1);
menu3.add(menu3item2);
}
private void createNumberShow() {//Method to create a number display area
numbershow.setHorizontalAlignment(JTextField.RIGHT);
numbershow.setBounds(5, 0, 245, 22);
numbershow.setEnabled(false);
numbershow.setDisabledTextColor(Color.BLACK);
c.add(numbershow);
}
private void createMemoShow() {//Method to create memory display
JTextField memoshow = new JTextField();
memoshow.setEditable(false);
memoshow.setBounds(10, 30, 28, 22);
memoshow.setBorder(new BasicBorders.FieldBorder(Color.black,
Color.black, Color.white, Color.white));
c.add(memoshow);
}
private void createClearButtons() {// Method to create three buttons such as Backspace, CE, and C
JButton[] clearbutton = new JButton[3];
String[] clearbuttontext = { "Backspace", "CE", "C" };
for (int i = 0; i < 3; i++) {
clearbutton[i] = new JButton();
clearbutton[i].setText(clearbuttontext[i]);
clearbutton[i].setHorizontalAlignment(SwingConstants.CENTER);
clearbutton[i].setMargin(new Insets(0, 0, 0, 0));
clearbutton[i].setFont(new java.awt.Font("Arial", 0, 9));
clearbutton[i].setForeground(Color.blue);
clearbutton[i].setBounds(48 + i * 68, 30, 63, 22);
clearbutton[i].setForeground(Color.red);
c.add(clearbutton[i]);
}
clearbutton[0].addActionListener(new ActionListener() {//Add a listener for the Backspace button
@Override
public void actionPerformed(ActionEvent e) {
if (number1.toString().equals("")) {// If no input is made
showNumber(numbershow, number1);//show number1
} else if (operator.toString().equals("")) {// If only number1 is entered
number1.deleteCharAt(number1.toString().length() - 1); // Remove the last character of number1
showNumber(numbershow, number1);//show number1
} else if (number2.toString().equals("")) {// If only number1 and operator are entered
showNumber(numbershow, number1);//No processing, display number1
} else {// If number1, operator, number2 are entered
number2.deleteCharAt(number2.toString().length() - 1); // Remove the last character of number2
showNumber(numbershow, number2);//show number2
}
}
});
clearbutton[1].addActionListener(new ActionListener() {//Add a listener for the CE button
@Override
public void actionPerformed(ActionEvent e) {
if (number1.toString().equals("")) {// If no input is made
showNumber(numbershow, number1);//show number1
} else if (operator.toString().equals("")) {// If only number1 is entered
number1.setLength(0);//Clear number1
showNumber(numbershow, number1);//show number1
} else if (number2.toString().equals("")) {// If number1 and operator are entered
showNumber(numbershow, number2);//No processing, display number2
} else {// If number1, operator, number2 are entered
number2.setLength(0);//Clear number2
showNumber(numbershow, number2);//show number2
}
}
});
clearbutton[2].addActionListener(new ActionListener() {//Add a listener for the C button
@Override
public void actionPerformed(ActionEvent e) {// Clear all storage
number1.setLength(0);
number2.setLength(0);
operator.setLength(0);
numbershow.setText("0.");
result.setLength(0);
}
});
}
private void createButtonArea() {//Method to create digital button area
JPanel ButtonArea = new JPanel();
ButtonArea.setBounds(5, 55, 245, 125);
ButtonArea.setLayout(new GridLayout(4, 6, 5, 5));
c.add(ButtonArea);
JButton[] numberbutton = new JButton[24];
String[] numberbuttontext = { "MC", "7", "8", "9", "/", "sqrt", "MR",
"4", "5", "6", "*", "%", "MS", "1", "2", "3", "-", "1/X", "M+",
"0", "+/-", ".", "+", "=" };
for (int i = 0; i < 24; i++) {// Use a loop to add labels to these 24 buttons
numberbutton[i] = new JButton(numberbuttontext[i]);
ButtonArea.add(numberbutton[i]);
if (i % 6 == 0 || i % 6 == 4 || i == 23) {// Operator button is set to red
numberbutton[i].setHorizontalAlignment(SwingConstants.CENTER);
numberbutton[i].setMargin(new Insets(0, 0, 0, 0));
numberbutton[i].setFont(new java.awt.Font("Arial", 0, 9));
numberbutton[i].setForeground(Color.red);
} else {//Other settings are blue
numberbutton[i].setHorizontalAlignment(SwingConstants.CENTER);
numberbutton[i].setMargin(new Insets(0, 0, 0, 0));
numberbutton[i].setFont(new java.awt.Font("Arial", 0, 9));
numberbutton[i].setForeground(Color.blue);
}
}
int[] numbers = { 19, 13, 14, 15, 7, 8, 9, 1, 2, 3 };//The numbers in this array respectively represent the serial numbers of numbers 0-9 in the numberbuttontext array
for (int i = 0; i <= 9; i++) { // Use a loop to add listeners for the ten number buttons 0-9
final String str = String.valueOf(i);
numberbutton[numbers[i]].addActionListener(new ActionListener() {//Add listeners for buttons 0-9
@Override
public void actionPerformed(ActionEvent e) {
if (operator.toString().equals("")) {// Before operator is entered
add(number1, str); // Only set the value of number1
showNumber(numbershow, number1);//Only display the value of number1
} else {// After entering operator
add(number2, str);//Only set the value of number2
showNumber(numbershow, number2);//Only display the value of number2
}
}
});
}
numberbutton[20].addActionListener(new ActionListener() { //Add a listener for the "+/-" button
@Override
public void actionPerformed(ActionEvent e) {
if (operator.toString().equals("")) {// Before operator is entered
add(number1, "+/-");// Set only the value of number1
showNumber(numbershow, number1);//Only display the value of number1
} else {// After entering operator
add(number2, "+/-");// Set only the value of number2
showNumber(numbershow, number2);//Only display the value of number2
}
}
});
numberbutton[21].addActionListener(new ActionListener() { //Add a listener for the "." button
@Override
public void actionPerformed(ActionEvent e) {
if (operator.toString().equals("")) {// Before entering operator, only the value of number1 is displayed
add(number1, ".");
showNumber(numbershow, number1);
} else {// After entering operator, only the value of number2 is displayed
add(number2, ".");
showNumber(numbershow, number2);
}
}
});
numberbutton[22].addActionListener(new ActionListener() { //Add a listener for the "+" button
@Override
public void actionPerformed(ActionEvent e) {
operator.setLength(0);
operator.append("+");
}
});
numberbutton[16].addActionListener(new ActionListener() { //Add a listener for the "-" button
@Override
public void actionPerformed(ActionEvent e) {
operator.setLength(0);
operator.append("-");
}
});
numberbutton[10].addActionListener(new ActionListener() { //Add a listener for the "*" button
@Override
public void actionPerformed(ActionEvent e) {
operator.setLength(0);
operator.append("*");
}
});
numberbutton[4].addActionListener(new ActionListener() { //Add a listener for the "/" button
@Override
public void actionPerformed(ActionEvent e) {
operator.setLength(0);
operator.append("/");
}
});
numberbutton[23].addActionListener(new ActionListener() { //Add a listener for the "=" button
@Override
public void actionPerformed(ActionEvent e) {
if (number1.toString().equals("")) {// When number1 is empty
showNumber(numbershow, number1);
} else if (operator.toString().equals("")) {// When number1 is not empty and operator is empty
showNumber(numbershow, number1);
} else if (number2.toString().equals("")) {// When number1 and operator are not empty, but number2 is empty
switch (operator.toString()) {
case ("+"): {
number2.append(number1.toString());
double d = Double.parseDouble(number1
.toString())
+ Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
case ("-"): {
number2.append(number1.toString());
double d = Double.parseDouble(number1
.toString())
- Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
case ("*"): {
number2.append(number1.toString());
double d = Double.parseDouble(number1
.toString())
* Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
case ("/"): {
number2.append(number1.toString());
double d = Double.parseDouble(number1
.toString())
/ Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
}
} else {// When number1, operator, number2 are not empty
switch (operator.toString()) {
case ("+"): {
double d = Double.parseDouble(number1
.toString())
+ Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
case ("-"): {
double d = Double.parseDouble(number1
.toString())
- Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
case ("*"): {
double d = Double.parseDouble(number1
.toString())
* Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
case ("/"): {
double d = Double.parseDouble(number1
.toString())
/ Double.parseDouble(number2.toString());
result.setLength(0);
result.append(d);
showNumber(numbershow, result);
number1.setLength(0);
number1.append(d);
}
break;
}
}
}
});
numberbutton[17].addActionListener(new ActionListener() { //Add a listener for the "1/x" button
@Override
public void actionPerformed(ActionEvent e) {
if (number1.toString().equals("")) {//When number1 is not entered
numbershow.setText("The divisor cannot be zero");
} else if (operator.toString().equals("")) {//number1 was entered, but operator was not entered
if (Double.parseDouble(number1.toString()) == 0) {// If the value of number1 is zero
numbershow.setText("The divisor cannot be zero");
} else {// If the value of number1 is not zero
double d = 1 / (Double.parseDouble(number1
.toString()));
number1.setLength(0);
number1.append(d);//Open and store the value of number1
showNumber(numbershow, number1);
}
} else if (number2.toString().equals("")) {//number1 and operator are entered, but number2 is not entered
double d = 1 / (Double.parseDouble(number1
.toString()));
number2.append(d);//Open and store the value of number1
showNumber(numbershow, number2);
} else {//Input number1, operator, number2
double d = 1 / (Double.parseDouble(number2
.toString()));
number2.setLength(0);
number2.append(d);//Open and store the value of number2
showNumber(numbershow, number2);
}
}
});
numberbutton[11].addActionListener(new ActionListener() { //Add a listener for the "%" button
@Override
public void actionPerformed(ActionEvent e) {
// Temporarily vacant
}
});
numberbutton[5].addActionListener(new ActionListener() { //Add a listener for the "sqrt" button
@Override
public void actionPerformed(ActionEvent e) {
if (number1.toString().equals("")) {//When number1 is not entered
showNumber(numbershow, number1);
} else if (operator.toString().equals("")) {//number1 was entered, but operator was not entered
if (Double.parseDouble(number1.toString()) < 0) {// number1 is less than 0
numbershow.setText("Function input is invalid");
} else {// number1 is greater than 0
double d = Math.sqrt(Double.parseDouble(number1
.toString()));
number1.setLength(0);
number1.append(d);//Open and store the value of number1
showNumber(numbershow, number1);
}
} else if (number2.toString().equals("")) {//number1 and operator are entered, but number2 is not entered
double d = Math.sqrt(Double.parseDouble(number1
.toString()));
number2.append(d);//Open and store the value of number1
showNumber(numbershow, number2);
} else {//Input number1, operator, number2
double d = Math.sqrt(Double.parseDouble(number2
.toString()));
number2.setLength(0);
number2.append(d);//Open and store the value of number2
showNumber(numbershow, number2);
}
}
});
}
public void add(StringBuilder s1, String s2) {// Define the method for changing the digital string after button input
if (s2.equals("+/-")) {// Define the change of the digital string after inputting "+/-"
if (s1.toString().equals("") || s1.toString().equals("0")) {// If the numeric string is empty or 0, no change will occur
s1.append("");
} else {// If the numeric string is neither empty nor 0, add or delete the "-" character before the numeric string
if (s1.toString().startsWith("-")) {
s1.deleteCharAt(0);
} else {
s1.insert(0, "-");
}
}
}
if (s2.equals(".")) {// Define the change of the digital string after inputting "."
if (s1.toString().indexOf(".") == -1) {// Find whether the number string contains the "." character, if not, execute the following code
if (s1.toString().equals("")) {// If the numeric string is empty, then set the numeric string to "0."
s1.setLength(0);
s1.append("0.");
} else {
s1.append(".");
}
} else {// If there is, no change will occur
s1.append("");
}
}
if (s2.equals("0")) {// Define the change of the digital string after inputting "0"
if (s1.toString().equals("0")) {// When the number string is "0", no change occurs
s1.append("");
} else {// When the number string is "0", add "0" after the string
s1.append("0");
}
}
for (int i = 1; i < 10; i++) {//Through the loop, define the changes in the digital string after inputting 1-9
String str = String.valueOf(i);
if (s2.equals(str)) {// Define the change of the digital string after inputting 1-9
if (s1.toString().equals("0")) {
s1.setLength(0);
s1.append(str);
} else
s1.append(str);
}
}
}
public void showNumber(JTextField j, StringBuilder s) {//Method to define how to display numerical strings in the number display area
if (s.toString().equals("") == true || s.toString().equals("0") == true) {
j.setText("0.");
} else if (s.toString().indexOf(".") == -1) {
j.setText(s.toString() + ".");
} else {
j.setText(s.toString());
}
}
}