实验题1 编写一个模拟计算器的程序,使用面板和网格布局,添加一个文本框,10个数字按钮(0-9),4个加减乘除按钮,一个等号按钮,一个清除按钮,要求将计算公式和结果显示在文本框中。
[基本要求] 编写完整程序
package cn.Text.javaSwing.Caculator;
import java.awt.Color;
import java.awt.Event;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.Date;
import javax.swing.JButton;
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.JSeparator;
import javax.swing.JTextField;
import javax.swing.KeyStroke;
import javax.swing.SwingConstants;
@SuppressWarnings("serial")
public class Caculate extends JFrame implements ActionListener {
private JTextField textField;
final JMenuItem newItemMenuItem_4;
boolean isDouble = false;// 是否为实数
int opFlag = -1;
static double t1 = 0, t2 = 0, t3 = 0, result = 0;
static int opflag1 = -1, opflag2 = -1, flag = 0, resflag = 1;
int preOp, currentOp = 0;// 标准位
double op1 = 0, op2 = 0;// 操作数
double n3;
StringBuffer buf = new StringBuffer(20);
StringBuffer copyBoard = new StringBuffer(20);// 剪贴板
StringBuffer memory = new StringBuffer(20);// M系列
StringBuffer str = new StringBuffer();
public static void main(String args[]) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
Caculate frame = new Caculate();
frame.setVisible(true);
frame.setResizable(false);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
public Caculate() {
super("Caculator");
Toolkit tk = Toolkit.getDefaultToolkit();
Image img = tk.getImage("D:/Java/1.gif");
setIconImage(img);
getContentPane().setBackground(Color.LIGHT_GRAY);
setBackground(Color.BLUE);
getContentPane().setLayout(null);
setBounds(100, 100, 314, 406);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
final JMenuBar menuBar = new JMenuBar();
setJMenuBar(menuBar);
final JMenu menu = new JMenu();
menu.setBackground(Color.DARK_GRAY);
menu.setName("");
menu.setMnemonic(KeyEvent.VK_V);
menu.setText("查看(V)");
menuBar.add(menu);
final JMenuItem newItemMenuItem = new JMenuItem();
newItemMenuItem.setMnemonic(KeyEvent.VK_1);
newItemMenuItem.setText("标准型 1");
menu.add(newItemMenuItem);
final JMenuItem newItemMenuItem_1 = new JMenuItem();
newItemMenuItem_1.setText("科学型");
menu.add(newItemMenuItem_1);
final JMenuItem newItemMenuItem_2 = new JMenuItem();
newItemMenuItem_2.setText("程序员");
menu.add(newItemMenuItem_2);
final JMenu menu_1 = new JMenu();
menu_1.setMnemonic(KeyEvent.VK_E);
menu_1.setText("编辑(E)");
menuBar.add(menu_1);
newItemMenuItem_4 = new JMenuItem();
final JMenuItem newItemMenuItem_3 = new JMenuItem();
newItemMenuItem_3.addActionListener(this);
newItemMenuItem_3.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.ALT_MASK));
newItemMenuItem_3.setText("复制(C)");
menu_1.add(newItemMenuItem_3);
newItemMenuItem_4.addActionListener(this);
newItemMenuItem_4.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_C,Event.ALT_MASK));
newItemMenuItem_4.setText("粘贴");
menu_1.add(newItemMenuItem_4);
menu_1.addSeparator();
final JMenu menu_2 = new JMenu();
menu_2.setText("历史记录");
menu_1.add(menu_2);
final JMenuItem newItemMenuItem_5 = new JMenuItem();
newItemMenuItem_5.setText("复制历史记录");
menu_2.add(newItemMenuItem_5);
final JMenuItem newItemMenuItem_6 = new JMenuItem();
newItemMenuItem_6.setText("编辑");
menu_2.add(newItemMenuItem_6);
final JMenuItem newItemMenuItem_7 = new JMenuItem();
newItemMenuItem_7.setText("取消编辑");
menu_2.add(newItemMenuItem_7);
final JMenuItem newItemMenuItem_8 = new JMenuItem();
newItemMenuItem_8.setText("清除");
menu_2.add(newItemMenuItem_8);
final JMenu menu_3 = new JMenu();
menu_3.setText("帮助");
menuBar.add(menu_3);
final JMenuItem newItemMenuItem_9 = new JMenuItem();
newItemMenuItem_9.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if(e.getSource()==newItemMenuItem_9){
helpHelp();
}
}
});
newItemMenuItem_9.setText("查看帮助");
menu_3.add(newItemMenuItem_9);
final JMenuItem newItemMenuItem_10 = new JMenuItem();
newItemMenuItem_10.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
if(e.getSource()==newItemMenuItem_10){
aboutCaculator();
}
}
});
newItemMenuItem_10.setText("关于计算器");
menu_3.add(newItemMenuItem_10);
textField = new JTextField();
textField.setFont(new Font("", Font.PLAIN, 14));
textField.setHorizontalAlignment(SwingConstants.RIGHT);
textField.setBounds(10, 10, 287, 47);
getContentPane().add(textField);
final JButton mcButton = new JButton();
mcButton.addActionListener(this);
mcButton.setForeground(Color.MAGENTA);
mcButton.setText("MC");
mcButton.setBounds(10, 63, 52, 28);
getContentPane().add(mcButton);
final JButton mrButton = new JButton();
mrButton.addActionListener(this);
mrButton.setForeground(Color.MAGENTA);
mrButton.setText("MR");
mrButton.setBounds(68, 63, 55, 28);
getContentPane().add(mrButton);
final JButton msButton = new JButton();
msButton.addActionListener(this);
msButton.setForeground(Color.MAGENTA);
msButton.setText("MS");
msButton.setBounds(129, 63, 52, 28);
getContentPane().add(msButton);
final JButton mButton = new JButton();
mButton.addActionListener(this);
mButton.setForeground(Color.MAGENTA);
mButton.setText("M+");
mButton.setBounds(187, 63, 52, 28);
getContentPane().add(mButton);
final JButton mButton_1 = new JButton();
mButton_1.addActionListener(this);
mButton_1.setForeground(Color.MAGENTA);
mButton_1.setText("M-");
mButton_1.setBounds(245, 63, 52, 28);
getContentPane().add(mButton_1);
final JButton button = new JButton();
button.addActionListener(this);
button.setForeground(Color.RED);
button.setFont(new Font("", Font.PLAIN, 16));
button.setText("←");
button.setBounds(10, 97, 52, 28);
getContentPane().add(button);
final JButton ceButton = new JButton();
ceButton.addActionListener(this);
ceButton.setForeground(Color.MAGENTA);
ceButton.setText("CE");
ceButton.setBounds(68, 97, 55, 28);
getContentPane().add(ceButton);
final JButton cButton = new JButton();
cButton.addActionListener(this);
cButton.setForeground(Color.RED);
cButton.setText("C");
cButton.setBounds(129, 97, 52, 28);
getContentPane().add(cButton);
final JButton button_3 = new JButton();
button_3.setForeground(Color.RED);
button_3.setFont(new Font("@Adobe 仿宋 Std R", Font.PLAIN, 16));
button_3.setText("±");
button_3.setBounds(187, 97, 52, 28);
getContentPane().add(button_3);
final JButton sqrtButton = new JButton();
sqrtButton.setFont(new Font("", Font.BOLD, 9));
sqrtButton.addActionListener(this);
sqrtButton.setForeground(Color.RED);
sqrtButton.setText("sqrt");
sqrtButton.setBounds(245, 97, 52, 28);
getContentPane().add(sqrtButton);
final JButton button_5 = new JButton();
button_5.addActionListener(this);
button_5.setForeground(Color.BLACK);
button_5.setBackground(Color.WHITE);
button_5.setText("7");
button_5.setBounds(10, 131, 52, 36);
getContentPane().add(button_5);
final JButton button_5_1 = new JButton();
button_5_1.setForeground(Color.BLACK);
button_5_1.setBackground(Color.WHITE);
button_5_1.addActionListener(this);
button_5_1.setText("8");
button_5_1.setBounds(68, 131, 55, 36);
getContentPane().add(button_5_1);
final JButton button_5_2 = new JButton();
button_5_2.addActionListener(this);
button_5_2.setForeground(Color.BLACK);
button_5_2.setBackground(Color.WHITE);
button_5_2.setText("9");
button_5_2.setBounds(129, 131, 52, 36);
getContentPane().add(button_5_2);
final JButton button_5_3 = new JButton();
button_5_3.addActionListener(this);
button_5_3.setForeground(Color.BLUE);
button_5_3.setText("/");
button_5_3.setBounds(187, 131, 52, 36);
getContentPane().add(button_5_3);
final JButton button_5_4 = new JButton();
button_5_4.setForeground(Color.BLUE);
button_5_4.setText("%");
button_5_4.setBounds(245, 131, 52, 36);
getContentPane().add(button_5_4);
final JButton button_5_5 = new JButton();
button_5_5.addActionListener(this);
button_5_5.setForeground(Color.BLACK);
button_5_5.setBackground(Color.WHITE);
button_5_5.setText("4");
button_5_5.setBounds(10, 173, 52, 36);
getContentPane().add(button_5_5);
final JButton button_5_6 = new JButton();
button_5_6.addActionListener(this);
button_5_6.setForeground(Color.BLACK);
button_5_6.setBackground(Color.WHITE);
button_5_6.setText("5");
button_5_6.setBounds(68, 173, 55, 36);
getContentPane().add(button_5_6);
final JButton button_5_7 = new JButton();
button_5_7.addActionListener(this);
button_5_7.setForeground(Color.BLACK);
button_5_7.setBackground(Color.WHITE);
button_5_7.setText("6");
button_5_7.setBounds(129, 173, 52, 36);
getContentPane().add(button_5_7);
final JButton button_5_8 = new JButton();
button_5_8.addActionListener(this);
button_5_8.setForeground(Color.BLUE);
button_5_8.setFont(new Font("", Font.BOLD | Font.ITALIC, 16));
button_5_8.setText("*");
button_5_8.setBounds(187, 173, 52, 36);
getContentPane().add(button_5_8);
final JButton button_5_9 = new JButton();
button_5_9.addActionListener(this);
button_5_9.setForeground(Color.BLUE);
button_5_9.setText("1/x");
button_5_9.setBounds(245, 173, 52, 36);
getContentPane().add(button_5_9);
final JButton button_5_10 = new JButton("1");
button_5_10.addActionListener(this);
button_5_10.setBackground(Color.WHITE);
button_5_10.setBounds(10, 215, 52, 36);
getContentPane().add(button_5_10);
JButton button_5_11 = new JButton("2");
button_5_11.addActionListener(this);
button_5_11.setBackground(Color.WHITE);
button_5_11.setBounds(68, 215, 55, 36);
getContentPane().add(button_5_11);
final JButton button_5_12 = new JButton("3");
button_5_12.addActionListener(this);
button_5_12.setBackground(Color.WHITE);
button_5_12.setBounds(129, 215, 52, 36);
getContentPane().add(button_5_12);
final JButton button_5_13 = new JButton("-");
button_5_13.addActionListener(this);
button_5_13.setForeground(Color.BLUE);
button_5_13.setFont(new Font("", Font.BOLD, 16));
button_5_13.setBounds(187, 215, 52, 36);
getContentPane().add(button_5_13);
final JButton button_5_14 = new JButton();
button_5_14.addActionListener(this);
button_5_14.setForeground(Color.BLUE);
button_5_14.setFont(new Font("", Font.PLAIN, 26));
button_5_14.setText("=");
button_5_14.setBounds(245, 215, 52, 79);
getContentPane().add(button_5_14);
final JButton button_5_15 = new JButton("0");
button_5_15.setForeground(Color.BLACK);
button_5_15.addActionListener(this);
button_5_15.setBackground(Color.WHITE);
button_5_15.setFont(new Font("", Font.BOLD, 24));
button_5_15.setBounds(10, 258, 113, 36);
getContentPane().add(button_5_15);
final JButton button_5_17 = new JButton();
button_5_17.addActionListener(this);
button_5_17.setForeground(Color.BLACK);
button_5_17.setFont(new Font("@Adobe 黑体 Std R", Font.BOLD, 26));
button_5_17.setText("·");
button_5_17.setBounds(129, 257, 52, 36);
getContentPane().add(button_5_17);
final JButton button_5_18 = new JButton();
button_5_18.addActionListener(this);
button_5_18.setForeground(Color.BLUE);
button_5_18.setFont(new Font("", Font.BOLD, 16));
button_5_18.setText("+");
button_5_18.setBounds(187, 258, 52, 36);
getContentPane().add(button_5_18);
final JLabel label = new JLabel();
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setForeground(Color.RED);
label.setFont(new Font("", Font.BOLD | Font.ITALIC, 24));
label.setBackground(Color.WHITE);
label.setText("标准型计算器");
label.setBounds(10, 300, 287, 43);
getContentPane().add(label);
//
}
@Override
public void actionPerformed(ActionEvent e) {
String s = e.getActionCommand();
if (s.equals("复制(C)")) {
String temp = textField.getText().trim();
copyBoard.replace(0, copyBoard.length(), temp);
newItemMenuItem_4.setEnabled(true);
} else if (s.equals("粘贴(p)")) {
textField.setText(copyBoard.toString());
} else if (s.equals("CE")) {
// 如果是CE则清除文本框
textField.setText("0.");
} else if (s.equals("BackSpace")) {
if (!textField.getText().trim().equals("0.")) {
// 如果文本框中有内容
if (str.length() != 1 && str.length() != 0) {
textField.setText(str
.delete(str.length() - 1, str.length()).toString());
} else {
textField.setText("0.");
str.setLength(0);
}
}
op2 = Double.parseDouble(textField.getText().trim());
} else if (s.equals("C")) {
// 如果是C删除当前计算
textField.setText("0.");
op1 = op2 = 0;
str.replace(0, str.length(), " ");
preOp = currentOp = 0;
} else if (s.equals("MC")) {
// 如果是MC则清除缓冲区
String temp = "";
memory.replace(0, memory.length(), temp);
} else if (s.equals("MR")) {
// 如果按键为MR则恢复缓冲区的数到文本框
textField.setText(memory.toString());
} else if (s.equals("MS")) {
// 如果按键为MS则将文本框的数存入缓冲区
String s1 = textField.getText().trim();
memory.replace(0, memory.length(), s1);
} else if (s.equals("M+")) {
// 如果按键为MS则将文本框值与缓冲区的数相加但不显示结果
String temp1 = textField.getText().trim();
double dtemp = Double.parseDouble(temp1);
String temp2 = memory.toString();
dtemp += Double.parseDouble(temp2);
temp1 = String.valueOf(dtemp);
memory.replace(0, memory.length(), temp1);
} else if (s.equals("1/x")) {
// 如果按键为1/x则将文本框中的数据为它的倒数
String temp = textField.getText().trim();
double dtemp = Double.parseDouble(temp);
textField.setText("1/"+dtemp+"=" + 1 / dtemp);
} else if (s.equals("sqrt")) {
// 如果按键为sqrt则将文本框中的内容求平方根
String temp = textField.getText().trim();
double dtemp = Double.parseDouble(temp);
textField.setText("sqrt(" +dtemp+")= "+ Math.sqrt(dtemp));
} else if (s.equals("+")) {
str.setLength(0);
if (currentOp == 0) {
preOp = currentOp = 1;
op2 = 0;
textField.setText("" + op1);
} else {
currentOp = preOp;
preOp = 1;
switch (currentOp) {
case 1:
op1 += op2;
textField.setText("" + op1);
break;
case 2:
op1 -= op2;
textField.setText("" + op1);
break;
case 3:
op1 *= op2;
textField.setText("" + op1);
break;
case 4:
op1 /= op2;
textField.setText("" + op1);
break;
}
}
} else if (s.equals("-")) {
str.setLength(0);
if (currentOp == 0) {
preOp = currentOp = 2;// op1=op2;op2=0;
textField.setText("" + op1);
} else {
currentOp = preOp;
preOp = 2;
switch (currentOp) {
case 1:
op1 = op1 + op2;
textField.setText("" + op1);
break;
case 2:
op1 = op1 - op2;
textField.setText("" + op1);
break;
case 3:
op1 = op1 * op2;
textField.setText("" + op1);
break;
case 4:
op1 = op1 / op2;
textField.setText("" + op1);
break;
}
}
} else if (s.equals("*"))// *
{
str.setLength(0);
if (currentOp == 0) {
preOp = currentOp = 3;// op1=op2;op2=1;
textField.setText("" + op1);// op1=op2;
} else {
currentOp = preOp;
preOp = 3;
switch (currentOp) {
case 1:
op1 = op1 + op2;
textField.setText("" + op1);
break;
case 2:
op1 = op1 - op2;
textField.setText("" + op1);
break;
case 3:
op1 = op1 * op2;
textField.setText("" + op1);
break;
case 4:
op1 = op1 / op2;
textField.setText("" + op1);
break;
}
}
} else if (s.equals("/"))// /
{
str.setLength(0);
if (currentOp == 0) {
preOp = currentOp = 4;// op2=1;
textField.setText("" + op1);// op1=op2;
} else {
currentOp = preOp;
preOp = 4;
switch (currentOp) {
case 1:
op1 = op1 + op2;
textField.setText("" + op1);
break;
case 2:
op1 = op1 - op2;
textField.setText("" + op1);
break;
case 3:
op1 = op1 * op2;
textField.setText("" + op1);
break;
case 4:
op1 = op1 / op2;
textField.setText("" + op1);
break;
}
}
} else if (s.equals("="))// =
{
if (currentOp == 0) {
str.setLength(0);
textField.setText("" + op2);
} else {
double op11=op1;
double op22=op2;
str.setLength(0);
currentOp = preOp;
switch (currentOp) {
case 1:
op1 = op1 + op2;
textField.setText(op11+"+"+op22+"=" + op1);
break;
case 2:
op1 = op1 - op2;
textField.setText(op11+"-"+op22+"=" + op1);
break;
case 3:
op1 = op1 * op2;
textField.setText(op11+"*"+op22+"=" + op1);
break;
case 4:
op1 = op1 / op2;
textField.setText(op11+"/"+op22+"=" + op1);
break;
}
currentOp = 0;
op2 = 0;
}
} else if (s.equals(".")) {
isDouble = true;
if (textField.getText().trim().indexOf('.') != -1){
//textField.setText(textField.getText());
}
else {
if (textField.getText().trim().equals("0")) {
str.setLength(0);
textField.setText((str.append("0" + s)).toString());
}
else if(textField.getText().trim().equals("")){}//如果初时显示为空则不做任何操作
else {
textField.setText((str.append(s)).toString());
}
}
} else if (s.equals("0"))// 如果选择的是"0"这个数字键
{
if (textField.getText().trim().equals("0.")) {
} else {
textField.setText(str.append(s).toString());
op2 = Double.parseDouble(textField.getText().trim());
}
} else {
textField.setText(str.append(s).toString());
op2 = Double.parseDouble(textField.getText().trim());
if (currentOp == 0)
op1 = op2;
}
}// end actionPerformed
public void helpHelp(){
JOptionPane.showMessageDialog(this," 该计算器的功能简单,可进行基本运算,在此对该计\n算器功能键介绍" +
"说明:“粉红色”的功能键已经实现,\n“红色”的功能键只有sqrt(开平方)能使用,如果按键为\nsqrt则将文本框中的内容求平方根!!如果按键" +
"为1/x则将\n文本框中的数据为它的倒数!!!此外“%”的功能未实现。\n*******谢谢使用************************************" +
"**" ,"help",JOptionPane.INFORMATION_MESSAGE);
}
public void aboutCaculator(){
JOptionPane.showMessageDialog(this," 这是一个很简单的计算器,“加、减、乘、除、开平方”这几个简单的\n功能基本上实现。" +
"其他功能及功能完善还有待改进,仅供学习参考!\n 作者:劳黑炭 于 二〇一二年十一月八日 版本:V 1.0 \n当前系统" +
"时间:"+new Date(),"简单计算器",JOptionPane.INFORMATION_MESSAGE);
}
}