📄 calculator.java
字号:
/**
* @(#)main.Calculator.java 2008-8-5
* Copy Right Information : Tarena
* Project : Calculator
* JDK version used : jdk1.6.4
* Comments : 计算器界面类。
* Version : 1.0
* Sr Date Modified By Why & What is modified
* 1. 2008-8-5 小猪 新建
**/
package main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.HeadlessException;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.io.IOException;
import javax.swing.AbstractAction;
import javax.swing.ButtonGroup;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
import javax.swing.border.BevelBorder;
import javax.swing.border.LineBorder;
import about.About;
/**
* 计算器界面类。<br>
* 练习使用ActionListener事件的处理。<br>
* 2008-8-5
* @author 达内科技[Tarena Training Group]
* @version 1.0
* @since JDK1.6(建议)
*/
public class Calculator extends JFrame implements ActionListener{
//==================菜单定义区=======================//
private JMenuBar menuBar=new JMenuBar();
private JMenu menuEdit=new JMenu("编辑(E)");
private JMenuItem menuItemCopy=new JMenuItem("复制(C)",KeyEvent.VK_C);
private JMenuItem menuItemCut=new JMenuItem("粘贴(P)",KeyEvent.VK_V);
private JMenu menuView=new JMenu("查看(V)");
private JRadioButton boxStand=new JRadioButton("标准型(T)",true);
private JRadioButton boxSience=new JRadioButton("科学型(S)",false);
private JMenuItem menuItemMath=new JMenuItem("数学分组",KeyEvent.VK_I);
private JMenu menuHelp=new JMenu("帮助(H)");
private JMenuItem menuItemHelp=new JMenuItem("帮助主题",KeyEvent.VK_H);
private JMenuItem menuItemAbout=new JMenuItem("关于计算器",KeyEvent.VK_A);
//================菜单定义区结束======================//
private JPanel panSave = new JPanel();
private JPanel panClear = new JPanel();
private JPanel panBtn = new JPanel();
private JTextField msg = new JTextField("0");
private CalculateButton[] buttons = new CalculateButton[27];
private JLabel lblInfo = new JLabel();
/** 保存预执行操作的数 */
private double value = 0;
/** 是否已经保存 */
private boolean hasSaved = false;
/** 保存的数字 */
private double saveNum = 0;
/** 运算操作:0:无操作。1:加。2:减。3:乘。4:除。 */
private int operation = 0;
/** 保存临时数据 */
private StringBuffer tmp = new StringBuffer();
/** 文字框允许输入的数字长度 */
private int allowLength = 32;
private boolean hasPressed = false;
/**
* 计算器界面类缺省构造函数。
*/
public Calculator() {
setSize(260,240);
setTitle("计算器");
Toolkit tk=Toolkit.getDefaultToolkit();
setLocation((tk.getScreenSize().width-getWidth())/2,(tk.getScreenSize().height-getHeight())/2);
initMenu();
initButton();
initAdd();
panSave.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_UP,0),"UpPress");
panSave.getActionMap().put("UpPress", new ButtonListener());
setResizable(false);
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
}
/**
* 初始化菜单添加。
*/
private void initMenu(){
//========菜单添加======================
setJMenuBar(menuBar);
menuBar.add(menuEdit);
menuEdit.setMnemonic(KeyEvent.VK_E);
menuEdit.add(menuItemCopy);
menuItemCopy.setMnemonic(KeyEvent.VK_C);
menuEdit.add(menuItemCut);
menuItemCut.setMnemonic(KeyEvent.VK_P);
menuBar.add(menuView);
menuView.setMnemonic(KeyEvent.VK_V);
ButtonGroup group=new ButtonGroup();
group.add(boxStand);
group.add(boxSience);
menuView.add(boxStand);
menuView.add(boxSience);
menuView.addSeparator();
menuView.add(menuItemMath);
menuBar.add(menuHelp);
menuHelp.setMnemonic(KeyEvent.VK_H);
menuHelp.add(menuItemHelp);
menuHelp.addSeparator();
menuHelp.add(menuItemAbout);
menuItemCopy.addActionListener(this);
menuItemCut.addActionListener(this);
menuItemAbout.addActionListener(this);
//=========菜单添加OK===================
}
/**
* 初始化按钮。按钮的初始化、部署、事件添加等。
*/
private void initButton(){
ButtonListener listener = new ButtonListener();
buttons[0] = new CalculateButton(listener,"=",KeyEvent.VK_EQUALS,false);
buttons[1] = new CalculateButton(listener,"+",KeyEvent.VK_ADD,false,Color.RED);
buttons[2] = new CalculateButton(listener,"-",KeyEvent.VK_SUBTRACT,false,Color.RED);
buttons[3] = new CalculateButton(listener,"*",KeyEvent.VK_MULTIPLY,false,Color.RED);
buttons[4] = new CalculateButton(listener,"/",KeyEvent.VK_DIVIDE,false,Color.RED);
buttons[5] = new CalculateButton(listener,"1/x",KeyEvent.VK_R,false);
buttons[6] = new CalculateButton(listener,"+/-",KeyEvent.VK_F9,false);
buttons[7] = new CalculateButton(listener,"sqrt",KeyEvent.VK_EQUALS,false);
buttons[8] = new CalculateButton(listener,"%",'%',false);
buttons[9] = new CalculateButton(listener,".",KeyEvent.VK_PERIOD,false);
buttons[10] = new CalculateButton(listener,"0",KeyEvent.VK_0,false);
buttons[11] = new CalculateButton(listener,"1",KeyEvent.VK_1,false);
buttons[12] = new CalculateButton(listener,"2",KeyEvent.VK_2,false);
buttons[13] = new CalculateButton(listener,"3",KeyEvent.VK_3,false);
buttons[14] = new CalculateButton(listener,"4",KeyEvent.VK_4,false);
buttons[15] = new CalculateButton(listener,"5",KeyEvent.VK_5,false);
buttons[16] = new CalculateButton(listener,"6",KeyEvent.VK_6,false);
buttons[17] = new CalculateButton(listener,"7",KeyEvent.VK_7,false);
buttons[18] = new CalculateButton(listener,"8",KeyEvent.VK_8,false);
buttons[19] = new CalculateButton(listener,"9",KeyEvent.VK_9,false);
buttons[20] = new CalculateButton(listener,"MC",KeyEvent.VK_L,true,Color.RED);
buttons[21] = new CalculateButton(listener,"MR",KeyEvent.VK_R,true,Color.RED);
buttons[22] = new CalculateButton(listener,"MS",KeyEvent.VK_M,true,Color.RED);
buttons[23] = new CalculateButton(listener,"M+",KeyEvent.VK_P,true,Color.RED);
buttons[24] = new CalculateButton(listener,"Backspace",KeyEvent.VK_BACK_SPACE,false,Color.RED,62,25);
buttons[25] = new CalculateButton(listener,"CE",KeyEvent.VK_DELETE,false,Color.RED,62,25);
buttons[26] = new CalculateButton(listener,"C",KeyEvent.VK_ESCAPE,false,Color.RED,62,25);
}
/**
* 初始化各个容器的添加。
*/
private void initAdd(){
LineBorder b = new LineBorder(Color.GRAY);
msg.setSize(240,20);
msg.setLocation(6, 4);
msg.setEditable(false);
msg.setBackground(Color.WHITE);
msg.setMargin(new Insets(0,6,0,8));
msg.setHorizontalAlignment(JTextField.RIGHT);
lblInfo.setSize(30,26);
lblInfo.setLocation(8, 30);
lblInfo.setBorder(new BevelBorder(BevelBorder.LOWERED));
lblInfo.setHorizontalAlignment(SwingConstants.CENTER);
panSave.setSize(35,150);
panSave.setLocation(6, 60);
panSave.setLayout(new FlowLayout(FlowLayout.CENTER,3,3));
//panSave.setBorder(b);
//增加MC、MR、MS、M+
for(int i=20;i<24;i++)
panSave.add(buttons[i]);
panClear.setSize(200,26);
panClear.setLocation(45, 30);
//panClear.setBorder(b);
panClear.setLayout(new FlowLayout(FlowLayout.CENTER,3,0));
//增加Backspace、CE、C
for(int i=24;i<27;i++)
panClear.add(buttons[i]);
panBtn.setSize(200, 150);
panBtn.setLocation(45, 60);
//panBtn.setBorder(b);
panBtn.setLayout(new FlowLayout(FlowLayout.CENTER,4,3));
panBtn.add(buttons[17]);//7
panBtn.add(buttons[18]);//8
panBtn.add(buttons[19]);//9
panBtn.add(buttons[4]);//÷
panBtn.add(buttons[7]);//sqrt
panBtn.add(buttons[14]);//4
panBtn.add(buttons[15]);//5
panBtn.add(buttons[16]);//6
panBtn.add(buttons[3]);//×
panBtn.add(buttons[8]);//%
panBtn.add(buttons[11]);//1
panBtn.add(buttons[12]);//2
panBtn.add(buttons[13]);//3
panBtn.add(buttons[2]);//-
panBtn.add(buttons[5]);//1/x
panBtn.add(buttons[10]);//0
panBtn.add(buttons[6]);//+/-
panBtn.add(buttons[9]);//.
panBtn.add(buttons[1]);//+
panBtn.add(buttons[0]);//=
setLayout(null);
add(msg);
add(lblInfo);
add(panSave);
add(panClear);
add(panBtn);
}
public static void main(String[] args){
new Calculator();
}
/**
* 处理按钮事件。
* 1.复制事件<br>
* 2.粘贴事件<br>
* 此处应用正则表达式(详细请参考类 java.util.regex.Pattern)解析粘贴板中的内容,仅得到内容中最后的数字和小数点。<br>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -