package java_GUI_AWT;
/**简单计算器**/
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class AWT_Calculator extends JFrame {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
AWT_Calculator new_AWT_Calculator = new AWT_Calculator();
new_AWT_Calculator.setResizable(false);
new_AWT_Calculator.setVisible(true);
}
AWT_Calculator() {
super("简单计算器");
initTextPanel(); /* 文本框 */
initControlPanel(); /* 控制键 */
initKeyPanel(); /* 数字和运算符 */
Container pane = getContentPane();
pane.setLayout(new BorderLayout());
pane.add(TextPanel, BorderLayout.NORTH);
pane.add(ControlPanel, BorderLayout.CENTER);
pane.add(KeyPanel, BorderLayout.SOUTH);
pack();
try {
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
} catch (Exception ex) {
;
} /* 设置Windons观感 */
SwingUtilities.updateComponentTreeUI(this);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
private void initTextPanel() {/* 设置文本框 */
TextPanel = new JPanel();
TextPanel.setLayout(new FlowLayout());
Resultarea = new JTextField("0", 25);
Resultarea.setEditable(false); /* 设置不可编辑 */
Color color = Color.white;
Resultarea.setBackground(color); /* 颜色 */
Resultarea.setHorizontalAlignment(JTextField.RIGHT); /* 设置显示位置 */
TextPanel.add(Resultarea);
}
private void initControlPanel() {/* 设置控制键 */
ControlPanel = new JPanel();
ControlPanel.setLayout(new GridLayout(1, 3, 4, 4));
JButton b1 = new JButton("Backspace"); /* Backspace键 */
b1.setFont(font1);
b1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
String s1 = Resultarea.getText();
int l = s1.length();
Resultarea.setText(s1.substring(0, l - 1));
}
});
ControlPanel.add(b1);
JButton b2 = new JButton("CE"); /* CE键 */
b2.setFont(font1);
b2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Resultarea.setText("0");
isNew = true;
}
});
ControlPanel.add(b2);
JButton b3 = new JButton("C"); /* C键 */
b3.setFont(font1);
b3.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
Resultarea.setText("0");
pnum = "";
operation = "";
isNew = true;
}
});
ControlPanel.add(b3);
}
private void initKeyPanel() { /* 设置数字键和运算符键 */
String key[] = { "7", "8", "9", "/", "sqrt", "4", "5", "6", "*", "%",
"1", "2", "3", "-", "1/x", "0", "+/-", ".", "+", "=" };
KeyPanel = new JPanel();
KeyPanel.setLayout(new GridLayout(4, 5, 4, 4));
for (int i = 0; i < 20; i++) {
String label = key[i];
JButton b = new JButton(label);
b.setActionCommand(key[i]);
b.setFont(font2);
KeyPanel.add(b);
b.addActionListener(new ActionListener() /* 无名监听器 */
{
public void actionPerformed(ActionEvent e) {
Key_actionPerformed(e);
}
});
}
}
public void Key_actionPerformed(ActionEvent e) /* 数字键和运算符键无名监听器 */
{
String s = (e.getActionCommand());
String st = Resultarea.getText();
if (s.equals("0")) /* 输入数为0 */
{
if (st.equals("0"))
return;
else {
if (!isNew)
Resultarea.setText(st + "0");
else
Resultarea.setText("0");
}
isNew = false;
return;
}
if (s.equals("+/-")) /* 输入数为+/- */
{
double k = Double.parseDouble(st);
{
if (k != 0)
display(-k);
}
return;
}
if (s.equals("1") || s.equals("2") || s.equals("3") || s.equals("4")
|| s.equals("5") || s.equals("6") || s.equals("7")
|| s.equals("8") || s.equals("9")) /* 输入1-9 */
{
if (!isNew)
Resultarea.setText(st + s);
else {
Resultarea.setText(s);
isNew = false;
}
return;
}
if (s.equals(".")) /* 输入小数点 */
{
if (Resultarea.getText().indexOf(".") == -1) /* 不存在小数点 */
{
if (isNew) {
Resultarea.setText("0.");
isNew = false;
} else
Resultarea.setText(st + ".");
}
return;
}
isNew = true; /* 按下运算符,输入新的数 */
if (s.equals("=")) {
compute(s);
operation = "";
} else {
if (s.equals("+") || s.equals("-") || s.equals("*")
|| s.equals("/")) /* 二目运算符号 */
{
if (operation.equals("")) {
pnum = Resultarea.getText();
operation = s;
} else
compute(s);
} else {/* 一目运算 */
Count count1 = new Count(Double.parseDouble(st));
if (s.equals("sqrt")) {
display(count1.sqrt());
} else if (s.equals("1/x")) {
if (st.equals("0")) {
Resultarea.setText("除数不能为0.");
operation = "";
pnum = "";
} else {
display(count1.reciprocal()); /* 求倒数 */
}
} else {
display(Double.parseDouble(st) / 100); /* 输入%,使当前显示的值除于100 */
}
}
}
}
private void compute(String s) {
if (s.equals("=")) {
if (operation.equals(""))
return;
}
double data1 = Double.parseDouble(pnum);
double data2 = Double.parseDouble(Resultarea.getText());
Count count2 = new Count(data1, data2); /* 加减乘除计算 */
if (operation.equals("+"))
display((count2.plus()));
else {
if (operation.equals("-"))
display((count2.minus()));
else {
if (operation.equals("*"))
display((count2.multiply()));
else if (operation.equals("/")) {
if (data2 == 0) {
Resultarea.setText("除数不能为0");
operation = "";
pnum = "";
return;
} else
display((count2.divide()));
}
}
}
operation = ""; /* 符号为当前符 */
pnum = Resultarea.getText();/* 运算数为当前文本数 */
}
public void display(double result) /* 显示输出方法 */
{
int a = (int) result;
if (a == result)
Resultarea.setText(String.valueOf(a));
else
Resultarea.setText(String.valueOf(result));
if (Resultarea.getText().equals("NaN"))
Resultarea.setText("输入函数无效");
}
private JPanel TextPanel; /* 文本框棉板 */
private JTextField Resultarea; /* 文本框 */
private JPanel ControlPanel; /* 控制键键面板 */
private JPanel KeyPanel; /* 数字键和运算符键面板 */
private Font font1 = new Font("Dialog", 0, 10); /* 控制键字体 */
private Font font2 = new Font("Dialog", 0, 10); /* 数字键和符号键字体 */
private String pnum = ""; /* 前操作数 */
private boolean isNew = true; /* 控制是否是新数 */
private String operation = ""; /* 运算符 */
}
class Count {
double number, data1, data2, result;
public Count(double number) {
this.number = number;
}
public Count(double data1, double data2) {
this.data1 = data1;
this.data2 = data2;
}
public double divide() {
result = data1 / data2;
return result;
}
public double multiply() {
result = data1 * data2;
return result;
}
public double minus() {
result = data1 - data2;
return result;
}
public double plus() {
result = data1 + data2;
return result;
}
public double sqrt() {
result = Math.sqrt(number);
return result;
}
public double reciprocal() {
result = 1 / number;
return result;
}
}