Java 计算器

来源:互联网 发布:淘宝网 雪嫦娥多肉植物 编辑:程序博客网 时间:2024/06/06 03:52


import java.awt.BorderLayout;import java.awt.Color;import java.awt.Dimension;import java.awt.Font;import java.awt.GridLayout;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.JPanel;import javax.swing.JTextField;public class BorderLayoutWindow extends JFrame implements ActionListener {private static final long serialVersionUID = 1L;// private 私密, final 只读(无法更改),按钮名称。private final String str[] = {"", "CE", "C", "←", "÷", "Pi", "7", "8", "9", "×", "n!", "4", "5", "6", "-", "+/-", "1", "2", "3", "+","(", ")", "0", ".", "="};private JButton buttonstr[] = new JButton[str.length];// 其他未实现功能名称。private final String key[] = {"x^2", "x^y", "sin", "cos", "tan","sqrt", "10^x", "log", "Exp", "Mod"};private JButton buttonkey[] = new JButton[key.length];// 文本框private JTextField resultText = new JTextField("0");// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字private boolean firstDigit = true;// 计算的中间结果。private double resultNum = 0.0;// 当前运算的运算符private String operator = "=";// 操作是否合法private boolean operateValidFlag = true;/** * 构造函数 */public BorderLayoutWindow(){//创建一个名字为“”的窗口super("计算器(zmy)");//设置窗口的布局为边缘布局setLayout(new BorderLayout());// 编辑菜单JMenuBar bar = new JMenuBar();JMenu menu = new JMenu("编辑");JMenuItem item = new JMenuItem("标准型");JMenuItem item1 = new JMenuItem("科学型");menu.add(item);menu.add(item1);bar.add(menu);this.setJMenuBar(bar);/* * setBorderPainted(false);         *去除此组件的边框。 * setPreferredSize(Dimension preferredSize)         *设置此组件的首选大小。 * setBackground(Color bg) *设置此组件的背景色。 * setForeground(Color fg) * 设置此组件的前景色。 * setFont(Font font) * 设置此组件的字体。 *  Font(String name, int style, int size) *根据指定名称、样式和磅值大小,创建一个新 Font。 * style:ITALIC = 2, BOLD = 1, PLAIN = 0; *///创建具有指定布局管理器的新面板。JPanel top = new JPanel(new BorderLayout());top.setPreferredSize(new Dimension(0,150));JPanel pstr = new JPanel(new GridLayout(5, 5));JPanel pkey = new JPanel(new GridLayout(2, 5));pstr.setPreferredSize(new Dimension(0,280));// 编辑按钮外观for (int i = 0; i < str.length; i++) {buttonstr[i] = new JButton(str[i]);if(i==6||i==7||i==8||i==11||i==12||i==13||i==16||i==17||i==18||i==22||i==23){buttonstr[i].setForeground(Color.blue);buttonstr[i].setFont(new Font("加粗",1,25));}else if(i%5 == 4 || i == 3)buttonstr[i].setFont(new Font("正常",0,25));elsebuttonstr[i].setFont(new Font("正常",0,20));buttonstr[i].setBackground(new Color(245,245,245));buttonstr[i].setBorderPainted(false);pstr.add(buttonstr[i]);}for (int i = 0; i < key.length; i++) {buttonkey[i] = new JButton(key[i]);buttonkey[i].setFont(new Font("正常",0,18));buttonkey[i].setBackground(Color.white);buttonkey[i].setBorderPainted(false);pkey.add(buttonkey[i]);}top.add("Center", resultText);// 文本框中的内容采用右对齐方式resultText.setHorizontalAlignment(JTextField.RIGHT);// 不允许修改结果文本框resultText.setEditable(false);// 设置文本框背景颜色为白色resultText.setBackground(Color.white);resultText.setFont(new Font("加粗",1,50));getContentPane().add(top, BorderLayout.NORTH);getContentPane().add(pkey, BorderLayout.CENTER);getContentPane().add(pstr, BorderLayout.SOUTH);// 为各按钮添加事件侦听器for (int i = 0; i < str.length; i++) {buttonstr[i].addActionListener(this);}for (int i = 0; i < key.length; i++) {buttonkey[i].addActionListener(this);}}/** * 处理事件 */public void actionPerformed(ActionEvent e) {// 获取事件源的标签String label = e.getActionCommand();if (label.equals(str[1])) {// 用户按了"CE"键resultText.setText("0");} else if (label.equals(str[2])) {// 用户按了"C"键// 初始化计算器的各种值resultText.setText("0");firstDigit = true;operator = "=";} else if (label.equals(str[3])) {// 用户按了"Backspace"键handleBackspace();} else if ("0123456789.".indexOf(label) >= 0) {// 用户按了数字键或者小数点键handleNumber(label);} else if(label.equals(str[5])) {// 用户按了Piif (firstDigit) {resultText.setText("3.1415926");}} else {// 用户按了运算符键handleOperator(label);}}/** * 处理Backspace键被按下的事件 */private void handleBackspace() {String text = resultText.getText();int i = text.length();if (i > 0) {// 退格,将文本最后一个字符去掉text = text.substring(0, i - 1);if (text.length() == 0) {// 如果文本没有了内容,则初始化计算器的各种值resultText.setText("0");firstDigit = true;operator = "=";} else {// 显示新的文本resultText.setText(text);}}}/** * 处理数字键被按下的事件 */private void handleNumber(String key) {if (firstDigit) {// 输入的第一个数字resultText.setText(key);} else if ((key.equals(".")) && (resultText.getText().indexOf(".") < 0)) {// 输入的是小数点,并且之前没有小数点,则将小数点附在结果文本框的后面resultText.setText(resultText.getText() + ".");} else if (!key.equals(".")) {// 如果输入的不是小数点,则将数字附在结果文本框的后面resultText.setText(resultText.getText() + key);}// 以后输入的肯定不是第一个数字了firstDigit = false;}/** * 处理运算符键被按下的事件 */private void handleOperator(String key) {if (operator.equals("÷")) {// 除法运算// 如果当前结果文本框中的值等于0if (getNumberFromText() == 0.0) {// 操作不合法operateValidFlag = false;resultText.setText("除数不能为零");} else {resultNum /= getNumberFromText();}} else if (operator.equals("+")) {// 加法运算resultNum += getNumberFromText();} else if (operator.equals("-")) {// 减法运算resultNum -= getNumberFromText();} else if (operator.equals("×")) {// 乘法运算resultNum *= getNumberFromText();} else if (operator.equals("sqrt")) {// 平方根运算resultNum = Math.sqrt(resultNum);} else if (operator.equals("Mod")) {// 模运算double temp = getNumberFromText();if((int)resultNum == resultNum && (int)temp == temp)resultNum = (int)resultNum%(int)temp;else{operateValidFlag = false;resultText.setText("浮点数不能Mod");}} else if (operator.equals("+/-")) {// 正数负数运算resultNum = resultNum * (-1);} else if (operator.equals("=")) {// 赋值运算resultNum = getNumberFromText();}if (operateValidFlag) {// 双精度浮点数的运算int t1;double t2;t1 = (int) resultNum;t2 = resultNum - t1;if (t2 == 0) {resultText.setText(String.valueOf(t1));} else {resultText.setText(String.valueOf(resultNum));}}// 运算符等于用户按的按钮operator = key;firstDigit = true;operateValidFlag = true;}/** * 从结果文本框中获取数字 */private double getNumberFromText() {double result = 0;try {result = Double.valueOf(resultText.getText()).doubleValue();} catch (NumberFormatException e) {}return result;}}

运算这部分是搬别人代码的┭┮﹏┭┮

原创粉丝点击