java普通计算器
基本思想:建立窗口时,我后面才想到把所有的组件先放到Container容器中。我先把计算器分解成,菜单栏,输入区,按钮区,分别对三个函数实现相应的操作,最后在计算器构造函数调用绑定到窗口。我创建了计算符操作按钮、非计算操作按钮、菜单监听器,三个监听器来实现菜单和按钮监听。对于各组件我采用GridBagLayout可变布局,再GridBagConstraints对布局组件布局设置。JTextField输入区全局定义为了方便按钮的输入。创建一个按钮函数,有利于添加的按钮布局设置以及根据不同类型的按钮添加不同的监听器。因为计算器有整数和小数计算的区别,我创建一个数值类根据不同的值,计算后返回不同的类型,在类内部实现数值的计算操作。最后单独一个函数来实现计算操作。
import java.awt.Container;
import java.awt.Font;
import java.awt.GridBagConstraints; import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
public class Caculat extends JFrame{
private GridBagLayout layout=new GridBagLayout();//可变布局
private GridBagConstraints constraints=new GridBagConstraints();//布局设置
private Container container=new Container();//容器,用于储存组件,最后一起添加到窗口
JTextField textField=new JTextField();//输入区
int fpoint=0;//textField 光标定位
String last="0";//存储最后输入的数字
String copty="";//编辑时使用
Numer result=new Numer();//结果暂存
Numer num=new Numer();//输入暂存
private String lastCommand="=";//保存+,-,*,/,=命令
Numer M;//结果存储器
boolean upfirst=true;//判断是否首次使用向上
private boolean start=false;//判断是否为数字的开始
private boolean setoperator=false;//判断是否使用计算符
private boolean den=false;//判断是否刚刚使用等号
public Caculat(){
super("计算器");
container.setLayout(layout);
addMenu();
addTextField();
addButton();
add(container);
}
//添加菜单
private void addMenu(){
JMenu menus[]=new JMenu[3];//主菜单
menus[0]=new JMenu("查看(V)");
menus[0].setMnemonic('F');
menus[1]=new JMenu("编辑(E)");
menus[1].setMnemonic('E');
menus[2]=new JMenu("帮助(H)");
menus[2].setMnemonic('H');
JMenuItem lookItem[]=new JMenuItem[2];//子菜单
JMenuItem aditItem[]=new JMenuItem[3];
JMenuItem helpItem[]=new JMenuItem[2];
lookItem[0]=new JMenuItem("普通型(O)");
lookItem[0].setMnemonic('O');//快捷键
lookItem[1]=new JMenuItem("
型(T)");
lookItem[1].setMnemonic('T');
aditItem[0]=new JMenuItem("复制(C) Ctrl+C");//这个不会,只知道Alt+C
aditItem[0].setMnemonic('C');
aditItem[1]=new JMenuItem("粘贴(P) Ctrl+V");
aditItem[1].setMnemonic('P');
aditItem[2]=new JMenuItem("自由编辑(F)");
aditItem[2].setMnemonic('F');
helpItem[0]=new JMenuItem("关于主题(H)");
helpItem[0].setMnemonic('H');
helpItem[1]=new JMenuItem("关于计算器(A)");
MenuAction menuaction=new MenuAction();//菜单监听器
lookItem[0].addActionListener(menuaction);
lookItem[1].addActionListener(menuaction);
aditItem[0].addActionListener(menuaction);
aditItem[1].addActionListener(menuaction);
aditItem[2].addActionListener(menuaction);
helpItem[0].addActionListener(menuaction);
helpItem[1].addActionListener(menuaction);
JMenuBar bar=new JMenuBar();//菜单容器吧
menus[0].add(lookItem[0]);menus[0].add(lookItem[1]);
menus[1].add(aditItem[0]);menus[1].add(aditItem[1]);
menus[1].add(aditItem[2]);
menus[2].add(helpItem[0]);menus[2].add(helpItem[1]);
setJMenuBar(bar);//把菜单绑到窗口上的方法
bar.add(menus[0]);
bar.add(menus[1]);
bar.add(menus[2]);
}
//添加输入区
private void addTextField(){
constraints.gridx=0;//组件x位置
constraints.gridy=1;//组件y位置
constraints.gridheight=1;//组件高度
constraints.gridwidth=5;//组件宽度
constraints.fill=GridBagConstraints.BOTH;//组件随显示变化的选项
constraints.weightx=1;//水平扩展,即显示变化时,长度变化
constraints.weighty=1;//垂直扩展,即高度变化
textField.setHorizontalAlignment(JTextField.RIGHT);//光标右边显示
textField.setEditable(false);//不可编辑
textField.setFont(new Font("Serif",Font.PLAIN,18));//显示字体
layout.setConstraints(textField, constraints);//把布局设置应用到组件上
container.add(textField);//把该组件添加到容器中
}
//添加按钮区
private void addButton(){
InsertAction insert=new InsertAction();
CommandAction command=new CommandAction();
addbutton("MC",0,2,1,1,command);addbutton("MR",1,2,1,1,command);
addbutton("MS",2,2,1,1,command);addbutton("M+",3,2,1,1,command);
addbutton("M-",4,2,1,1,command);addbutton("Delete",0,3,1,1,insert);
addbutton("CE",1,3,1,1,insert);addbutton("C",2,3,1,1,insert);
addbutton("?",3,3,1,1,insert);addbutton("?",4,3,1,1,command);
addbutton("7",0,4,1,1,insert);addbutton("8",1,4,1,1,insert);
addbutton("9",2,4,1,1,insert);addbutton("?",3,4,1,1,command);
addbutton("%",4,4,1,1,command);addbutton("4",0,5,1,1,insert);
addbutton("5",1,5,1,1,insert);addbutton("6",2,5,1,1,insert);
addbutton("×",3,5,1,1,command);addbutton("1/x",4,5,1,1,command);
addbutton("1",0,6,1,1,insert);addbutton("2",1,6,1,1,insert);
addbutton("3",2,6,1,1,insert);addbutton(",",3,6,1,1,command);
addbutton(",",4,6,1,1,command);addbutton("0",0,7,1,1,insert);
addbutton(".",1,7,1,1,insert);addbutton("=",4,7,1,1,command);
addbutton("?",2,7,1,1,command);addbutton("?",3,7,1,1,command);
}
//单个按钮设置
private void addbutton(String label,int x,int y,int height,int width,ActionListener listener){
JButton button=new JButton(label);
constraints.gridx=x;
constraints.gridy=y;
constraints.gridheight=height;
constraints.gridwidth=width;
constraints.fill=GridBagConstraints.BOTH;
button.addActionListener(listener);
layout.setConstraints(button,constraints);
container.add(button);//container.
}
//非计算符监听器。主要是非计算操作的按钮
private class InsertAction implements ActionListener{
public void actionPerformed(ActionEvent event){
String input=event.getActionCommand();//获取输入的按钮
String output=textField.getText();//获取输入区内容
//不再使用等号。主要是刷新输入
if(den){
lastCommand="=";
den=false;}
//输入区的删除
if(input.equals("Delete")){
if(fpoint>0){
textField.setText(output.substring(0,fpoint-1)+
output.substring(fpoint,output.length()));
if(fpoint>0)fpoint--;}//光标位置减一
return;}
//删除前一次计算的结果
if(fpoint==output.length()&&setoperator==true){
textField.setText("");
output=textField.getText();
fpoint=output.length();
setoperator=false;}
if(input.equals(".")){//防止重复输入"."
if(output.indexOf(".")==-1){//在输入区中间插入
if(fpoint
0){
textField.setText(output.substring(0, fpoint)+input+
output.substring(fpoint,output.length()) );
fpoint++;output=textField.getText();}
else if(fpoint==output.length()){//输入区尾部插入
if(output.length()==0){textField.setText("0.");}//空输入时加"0."
else textField.setText(output+".");
output=textField.getText();fpoint=output.length();}
}
start=true;return;}
//键入数字
if(!input.equals("?")&&!input.equals("CE")&&!input.equals("C")){
//初始添加数字
if(output.equals("0")){textField.setText(input);
fpoint=input.length(); start=true;return;}
//在中间插入数字
if(fpoint0)fpoint--;
textField.setText(output.substring(0,fpoint)+"?"+
output.substring(fpoint,output.length()));
}
return;}
if(input.equals("?")){
if(!output.equals("")){
if(fpoint