📄 simplecalculator.java
字号:
/**
*实验名称: 计算器
*
*1.实验目的:图形界面设计。
* 熟悉java.awt包中的组件,掌握图形界面设计方法,理解委托事件处理模型。
*
*2.题意:
* 请设计并实现Windows系统中“计算器”的窗口及功能。
*
*3.实验要求:
* (1)设计图形界面添加菜单:窗口上添加各种组件及菜单,并处理组件及菜单的事件监听程序。
* (2)运算:实现多种运算,保证运算正确性。
*
*
*作者:计算机032 胡勇健 03095218
*/
import java.awt.*;
import java.awt.event.*;
import java.awt.datatransfer.*;
import javax.swing.*;
public class SimpleCalculator extends TextField implements ActionListener,ItemListener
{
//私有成员变量的定义:
/*以下为计算机的各部分组件*/
Frame mainFrame; //主框架
JTextField answerText; //显示计算结果
JTextField memoryState; //显示计算器内存的使用情况
MenuBar menuGroup; //菜单栏
Menu editMenu,viewMenu,helpMenu; //编辑,查看,帮助菜单
MenuItem copyItem,pasteItem; //复制,粘贴
MenuItem standardModel; //标准型
CheckboxMenuItem numGroup; //数字分组
MenuItem aboutCal; //关于计算器
Button buttonBackSpace,buttonCE,buttonC; //退格,清除,清空按钮
Button buttonMC,buttonMR,buttonMS,buttonMADD; //内存操作按钮
Button buttonNum[]; //数字按钮
Button buttonAdd,buttonSub,buttonMul,buttonDiv; //+,-,*,/
Button buttonDot,buttonSign,buttonEqual; //. +/- =
Button buttonSqrt,buttonMod,buttonReciprocal; //sqrt % 1/x
/*以下为运算时所用到的变量*/
StringBuffer textBuffer; //记录数值的字符串
int numDot; //小数点的个数
int operator; //操作符:1-加法 2-减法 3-乘法 4-除法
double firstValue,secondValue,result; //第一、二个数及结果
boolean enterSecond; //是否已经输入了第二个数
int forFirOrSec; //此时输入的是第一个还是第二个数
boolean b_remFir,b_remSec,b_remFun; //指示是否此时还记的上次的数和运算符
int remFun; //记住上次的运算符
double remFir,remSec; // 记住上次参加运算的第一二个数
boolean isNumGroup=false; //记录是否为数字分组
boolean canBeBack; //是否可以使用退格键
double memory; //用于内存操作时保存的数据
/*以下为本计算器与系统其他资源数据交换的变量*/
Clipboard clipbd = getToolkit().getSystemClipboard();
//结束私有成员变量的定义。
//构造函数:
SimpleCalculator()
{
initMainFrame();
initTextField();
initButtons();
initMenu();
OverallArrangement();
reSet();
mainFrame.setVisible(true);
}
//结束构造函数。
//对各GUI组件进行的操作函数
/*
* void initMainFrame()函数是对主框架进行初始化,设置其框架大小270*250,
* 初始位置270*250,背景颜色Color.lightGray, 是否显示true,能否改变窗
* 口大小false,以及增加了addWindowListener委托事件,当关闭窗口时调用
* System.exit(0) 系统指令,结束程序。
*/
void initMainFrame()
{
mainFrame = new Frame("计算器");
mainFrame.setSize(270,250);
mainFrame.setLocation(200,140);
mainFrame.setBackground(Color.lightGray);
mainFrame.setResizable(false);
mainFrame.addWindowListener(new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
});
}
/*
* initTextField() 是对文本 textBuffer answerText memoryState得初始化,
* textBuffer 是用于对文本的缓冲处理,StringBuffer类优于String类是因为
* StringBuffer是对字符串直接操作,从而节省了内存。由于在这个计算器程
* 序中,对字符串的操作量很大,因此,StringBuffer 在这方面体现出了其本身
* 的优势。answerText 和 memoryState 用swing的组件JTextField是因为JTextField
* 显示文本框时可以在文本框的右边显示,符合Windows自带计算器的特点。
* answerText 和 memoryState 的背景色为白色,都不能进行编辑。answerText
* 为右对齐,大小为23个字符,而memoryState为2个字符。
*/
void initTextField()
{
textBuffer = new StringBuffer("");
answerText = new JTextField(textBuffer.toString(),22);
answerText.setHorizontalAlignment(JTextField.RIGHT);
answerText.setEditable(false);
answerText.setBackground(Color.white);
memoryState = new JTextField(2);
memoryState.setEditable(false);
memoryState.setBackground(Color.white);
}
/*
* initButtons()函数是对各按钮进行初始化,为每一个按钮增加其标签
* 并增加了 addActionListener(this) 功能,用于给各按钮增加属性,
* 具体的功能代码,请见 actionPerformed(ActionEvent e);其中,数字
* 按钮、四则运算按钮、小数点按钮都增加了键盘输入功能addKeyListener
* 其参数为匿名类KeyListener的适配器new KeyAdapter(),当在键盘上按下
* 相应的键时,为其增加相应的属性功能。
*/
void initButtons()
{
buttonBackSpace = new Button("BackSpace");
buttonBackSpace.addActionListener(this);
buttonCE = new Button(" CE ");
buttonCE.addActionListener(this);
buttonC = new Button(" C ");
buttonC.addActionListener(this);
buttonMC = new Button("MC");
buttonMC.addActionListener(this);
buttonMR = new Button("MR");
buttonMR.addActionListener(this);
buttonMS = new Button("MS");
buttonMS.addActionListener(this);
buttonMADD = new Button("M+");
buttonMADD.addActionListener(this);
buttonNum = new Button[10];
for (int i=0;i<buttonNum.length ;i++ )
{
buttonNum[i] = new Button(Integer.toString(i));
buttonNum[i].addActionListener(this);
buttonNum[i].addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (Character.isDigit(e.getKeyChar()))
{
textBuffer.append(e.getKeyChar());
answerText.setText(textBuffer.toString());
AddNum();
}
}
});
}
buttonAdd = new Button("+");
buttonAdd.addActionListener(this);
buttonAdd.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (e.getKeyChar() == '+')
AddFunction(1);
}
});
buttonSub = new Button("-");
buttonSub.addActionListener(this);
buttonSub.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (e.getKeyChar() == '-')
AddFunction(2);
}
});
buttonMul = new Button("*");
buttonMul.addActionListener(this);
buttonMul.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (e.getKeyChar() == '*')
AddFunction(3);
}
});
buttonDiv = new Button("/");
buttonDiv.addActionListener(this);
buttonDiv.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (e.getKeyChar() == '/')
AddFunction(4);
}
});
buttonDot = new Button(".");
buttonDot.addActionListener(this);
buttonDot.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (e.getKeyChar() == '.')
{
textBuffer.append(e.getKeyChar());
answerText.setText(textBuffer.toString());
AddNum();
}
}
});
buttonSign = new Button("+/-");
buttonSign.addActionListener(this);
buttonEqual = new Button("=");
buttonEqual.addActionListener(this);
buttonEqual.addKeyListener(new KeyAdapter(){
public void keyTyped(KeyEvent e){
if (e.getKeyChar() == '=')
OnGo();
}
});
buttonSqrt = new Button("sqrt");
buttonSqrt.addActionListener(this);
buttonMod = new Button("%");
buttonMod.addActionListener(this);
buttonReciprocal = new Button("1/x");
buttonReciprocal.addActionListener(this);
}
/*
* initMenu()函数是对各菜单的初始化,先为其生成实例对象,再添加到
* MenuBar 的实例对象 menuGroup 中,MenuItem 各项添加到相应的 Menu中。
*/
void initMenu()
{
/*
* 先为各个菜单项生成实例对象,并为其设置相应的标签。MenuItem各项
* 还要设置 addActionListener(this) 增加委托事件任务。
*/
menuGroup = new MenuBar();
editMenu = new Menu("编辑(E)");
viewMenu = new Menu("查看(V)");
helpMenu = new Menu("帮助(H)");
copyItem = new MenuItem("复制(C) Ctrl+C",new MenuShortcut(KeyEvent.VK_C));
copyItem.addActionListener(new CopyNum());
pasteItem = new MenuItem("粘贴(P) Ctrl+V",new MenuShortcut(KeyEvent.VK_V));
pasteItem.addActionListener(new PasteNum());
standardModel = new MenuItem("●标准型(T)");
standardModel.addActionListener(this);
numGroup = new CheckboxMenuItem("数字分组(I)",false);
numGroup.addItemListener(this);
aboutCal = new MenuItem("关于计算器(A)");
aboutCal.addActionListener(this);
/* 再把各个菜单相继加入到 MenuBar 中 */
menuGroup.add(editMenu);
menuGroup.add(viewMenu);
menuGroup.add(helpMenu);
editMenu.add(copyItem);
editMenu.add(pasteItem);
viewMenu.add(standardModel);
viewMenu.add(numGroup);
helpMenu.add(aboutCal);
}
/*
* OverallArrangement() 是根据mainFrame的框架大小,把文本框answerText,
* 内存使用的情况文本框memoryState,内存操作键 MR MS M+ MC,退格键BackSpace
* 清除键 CE ,清空键 C ,以及主键盘区的各键按照一定的比例位置加入到mainFrame
* 中.
*/
void OverallArrangement()
{
Panel textPanel = new Panel(); //文本框的容器
Panel upperPanel = new Panel(); //计算器上部分的容器
Panel centerPanel = new Panel(); //计算器中部的容器
Panel mainPanel = new Panel(); //主键盘区的容器
Panel leftPanel = new Panel(); //内存区的容器
Panel rightPanel = new Panel(); //数字及相应的操作键盘区
mainFrame.setMenuBar(menuGroup); //为主框架设置菜单栏
mainFrame.add(upperPanel,BorderLayout.NORTH); //把上容器放在主框架的北面
mainFrame.add(centerPanel); //把中容器放在主框架的中部
mainFrame.add(mainPanel,BorderLayout.SOUTH); //把主容器放在主框架的南面
/*设置主框架的上半部分*/
textPanel.add(answerText); //把文本框添加到文本容器中
upperPanel.add(textPanel); //把文本容器放入上容器中
/*设置主框架的中部*/
//采用流式布局,各组件相互间隔10个像素
centerPanel.setLayout(new FlowLayout(FlowLayout.CENTER,10,10));
centerPanel.add(memoryState); //把内存记忆框放在中容器中
centerPanel.add(buttonBackSpace); //把退格键放在中容器中
centerPanel.add(buttonCE); //把清除键放在中容器中
centerPanel.add(buttonC); //把清空键放在中容器中
/*设置主框架的下半部分*/
leftPanel.setLayout(new GridLayout(4,1,0,5)); //左下角的容器采用4*1的网式布局
leftPanel.add(buttonMC); //添加MC
leftPanel.add(buttonMR); //添加MR
leftPanel.add(buttonMS); //添加MS
leftPanel.add(buttonMADD); //添加M+
mainPanel.add(leftPanel,BorderLayout.WEST); //把此容器放在主容器的西面
/*设置主键盘区*/
rightPanel.setLayout(new GridLayout(4,5,5,5)); //采用4*5的网式布局,相互间隔5各像素
/*添加各键*/
rightPanel.add(buttonNum[7]);
rightPanel.add(buttonNum[8]);
rightPanel.add(buttonNum[9]);
rightPanel.add(buttonDiv);
rightPanel.add(buttonSqrt);
rightPanel.add(buttonNum[4]);
rightPanel.add(buttonNum[5]);
rightPanel.add(buttonNum[6]);
rightPanel.add(buttonMul);
rightPanel.add(buttonMod);
rightPanel.add(buttonNum[1]);
rightPanel.add(buttonNum[2]);
rightPanel.add(buttonNum[3]);
rightPanel.add(buttonSub);
rightPanel.add(buttonReciprocal);
rightPanel.add(buttonNum[0]);
rightPanel.add(buttonSign);
rightPanel.add(buttonDot);
rightPanel.add(buttonAdd);
rightPanel.add(buttonEqual);
mainPanel.add(rightPanel,BorderLayout.CENTER);
}
//结束对各GUI组件进行的操作函数。
/*
* actionPerformed(ActionEvent e) 是为各按钮及菜单项添加相应的属性
*/
public void actionPerformed(ActionEvent e)
{
Object event = e.getSource(); //所按下的按钮的命令
//如果按下的是数字键
for (int i=0;i<buttonNum.length;i++)
{
if (event == buttonNum[i])
{
textBuffer.append(e.getActionCommand());
showScreen();
AddNum();
canBeBack = true;
}
}
//如果按下的是小数点
if (event == buttonDot)
{
if (textBuffer.indexOf(".") == -1)
{
numDot = 1;
textBuffer.append(".");
showScreen();
}
}
//如果按下的是退格键
if (event == buttonBackSpace && canBeBack == true)
{
if (textBuffer.length() > 0)
{
if (textBuffer.length()==1)
textBuffer = new StringBuffer("0");
else textBuffer.deleteCharAt(textBuffer.length()-1);
showScreen();
AddNum();
}
}
//如果按下的是清除键
if (event == buttonCE)
{
reSet();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -