import javax.swing.*;
public class Ji extends JFrame
{
public Ji()
{
add(new JiSuanQi());//将JiSuanQi实例加入到框架中
pack();//pack类可以调整窗口大小,以适合其组件的大小和布局
}
}
import java.awt.*;
import javax.swing.*;
public class JiSuan
{
public static void main(String[] args)
{
EventQueue.invokeLater(() -> {
Ji frame = new Ji();//构建Ji类,调用Ji中的方法
frame.setTitle("Calculator");//设置窗口标题为Calculator(计算器)
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//构建窗口,EXIT_ON_CLOSE表示结束窗口所在的应用程序,在窗口被关闭时退出
frame.setVisible(true);//设置窗口可见,否则窗口不会显示
});// 使用EventQueue.invokeLater,其好处是调用完这个方法后将其销毁,由于匿名内部类作为临时变量存在,给它分配的内存此时被释放
}
}
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class JiSuanQi extends JPanel
{
public static Object event;
public JButton display;
public JPanel panel;
public double result;
public String lastCommand;
public boolean start;
public JiSuanQi()
{
setLayout(new BorderLayout());//设置屏幕上组件的格式布局
result = 0;//用于记录计算结果
lastCommand = "=";//lastcommand译为最后指令,表示输入最后指令为“=“(输入后开始执行计算过程)
start = true;//如果为真,则开始
display = new JButton("0");//display用于生成框类型,值为0
display.setEnabled(false);
add(display, BorderLayout.NORTH);//将此框放在最上面(初始显示数值为0,此框用于展示计算结果)
ActionListener insert = new InsertAction();//调用类里的InsertAction方法(用于获取点击按钮的数值)
ActionListener command = new CommandAction();//调用类里的CommandAction方法(进行计算过程)
panel = new JPanel();
panel.setLayout(new GridLayout(4, 4));//设置4行4列的按钮
//下面就是设置按钮了,其中insert表示要获取该按钮的数字,command表示进行计算的按钮(insert,command已在上面构建,分别使用InsertAction,CommandAction方法)
//第一行按钮
addButton("7", insert);
addButton("8", insert);
addButton("9", insert);
addButton("/", command);
//第二行按钮
addButton("4", insert);
addButton("5", insert);
addButton("6", insert);
addButton("*", command);
//第三行按钮
addButton("1", insert);
addButton("2", insert);
addButton("3", insert);
addButton("-", command);
//第四行按钮
addButton("0", insert);
addButton(".", insert);
addButton("=", command);
addButton("+", command);
add(panel, BorderLayout.CENTER);//将按钮布置在窗口中央位置
}
public void addButton(String label, ActionListener listener)//开始添加按钮
{
JButton button = new JButton(label);
button.addActionListener(listener);
panel.add(button);
}
public class InsertAction implements ActionListener//用于获取按钮数值
{
public void actionPerformed(ActionEvent event)//点击按钮后发生的反应
{
String input = event.getActionCommand();//获取被点击按钮的数值(对应上面的insert)
if (start)//如果为真(即点击按钮获取到数值),前面已定义start为true,则:
{
display.setText("");//将该数值显示到最上面的框中(此框已在上面定义)
start = false;
}
display.setText(display.getText() + input);//将获取的按钮数值开始展示在框内
}
}
//下面方法是进行运算第一步,由于”-“可能是性质符号,而不是运算符号,所以先对”-“进行处理
public class CommandAction implements ActionListener//执行计算操作前对”-“进行处理
{
public void actionPerformed(ActionEvent event)//点击按钮后发生的反应
{
String command = event.getActionCommand();//获取按钮的内容(即运算符号,对应上面的command)
if (start)//如果为真(即点击了按钮并获取到运算符号的信息),则开始:
{
if (command.equals("-"))//如果点击的按钮为”-“
{
display.setText(command);//显示在最上面的框内(表示一个负号,此时为负数)
start = false;//则让start变成false,防止再次被当作负号处理(例如依次输入”1“”-“”-“”1“则有一个”-“为减号)
}
else lastCommand = command;//不是”-“则直接进行计算操作
}
else
{
calculate(Double.parseDouble(display.getText()));//如果没有输入运算符号也直接进行计算操作(例如输入1-2,此时一个”-“直接作为运算符号)
lastCommand = command;
start = true;
}
}
}
public void calculate(double x)
{
if (lastCommand.equals("+")) result += x;//点击按钮”+“后进行加法运算
else if (lastCommand.equals("-")) result -= x;//点击按钮”-“后进行减法运算
else if (lastCommand.equals("*")) result *= x;//点击按钮”*“后进行乘法运算
else if (lastCommand.equals("/")) result /= x;//点击按钮”/“后进行除法运算
else if (lastCommand.equals("=")) result = x;//点击按钮”=“后进行等于运算
display.setText("" + result);//在上面的框内显示出计算结果result
}
}