完成效果
代码
刚学所以也许有很多缺点,供参考,希望对你有帮助。
import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Date;
import java.text.SimpleDateFormat;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
public class Calculator {
public static void main(String[] args){
JFrame f = new JFrame("计算器");
f.setSize(450, 650); //设置容器尺寸
f.setLocation(200, 100); //设置容器位置
f.setLayout(null); //设置布局。
//显示框
JTextField text = new JTextField("");
text.setFont(new Font("宋体",Font.BOLD,30)); //设置文本框字体样式
text.setHorizontalAlignment(JTextField.RIGHT); //设置文本右对齐
text.setBounds(20, 20, 390, 70); //设置位置和大小
text.setEditable(false); //设置文本框不可编辑
text.setBorder(new EmptyBorder(0,0,0,0)); //设置无边框
text.setBackground(Color.white); //设置文本框背景颜色
f.add(text);
//按钮区
int k = 0, m = 1;
Color c1 = new Color(255,102,102);
Color c2 = new Color(108,123,139);
Color c3 = new Color(0,154,205);
Color c4 = new Color(185,211,238);
for(int i=1;i<=20;i++) {
JButton t = new JButton(); //创建按钮
t.setBackground(c2); //设置按钮背景颜色
switch(i) {
case 3: t.setText("C");
t.setBackground(c1);
break;
case 4: t.setText("<<");
t.setBackground(c1);
break;
case 2: t.setText("time");
t.setBackground(c1);
break;
case 1: t.setText("÷");
t.setBackground(c4);
break;
case 6: t.setText("7");break;
case 7: t.setText("8");break;
case 8: t.setText("9");break;
case 5: t.setText("×");
t.setBackground(c4);
break;
case 10:t.setText("4");break;
case 11:t.setText("5");break;
case 12:t.setText("6");break;
case 9:t.setText("-");
t.setBackground(c4);
break;
case 14:t.setText("1");break;
case 15:t.setText("2");break;
case 16:t.setText("3");break;
case 13:t.setText("+");
t.setBackground(c4);
break;
case 19:t.setText("0");break;
case 17:t.setText("(");
t.setBackground(c4);
break;
case 18:t.setText(")");
t.setBackground(c4);
break;
case 20:t.setText("=");
t.setBackground(c3);
break;
}
t.setBounds(20+100*(m-1), 110+100*k, 80, 80); //设置按钮在容器中的位置
if(i%4==0) {
k++;
m=0;
}
m++;
t.setBorderPainted(false); //删去按钮边框
t.setFont(new java.awt.Font("宋体", 1, 20)); //设置按钮类型、样式、大小
t.setFocusPainted(false); //删去按钮文字的焦点框
t.setForeground(Color.white); //设置按钮文字颜色
final int[] num = new int[1];
num[0] = i;
t.addActionListener(new ActionListener(){ //设置按钮监听事件
@Override
public void actionPerformed(ActionEvent e) {
// TODO Auto-generated method stub
if(text.getText().length()!=0) {
if((text.getText().charAt(0) + "").getBytes().length != 1) { //判断如果为中文清空
text.setText("");
}
}
if(num[0]==3) {
text.setText("");
}else if(num[0]==4) {
if(text.getText().length()!=0) {
text.setText(text.getText().substring(0, text.getText().length()-1));
}
}else if(num[0]==20) {
String str = text.getText();
if(!checkBracket(str.toCharArray(), str.length())) {
text.setText("括号不匹配!!");
}else {
int res;
try {
res = calculate(str.toCharArray(),str.length());
text.setText(String.valueOf(res));
}catch(Exception e1){
text.setText("输入格式不正确!");
}
}
}else if(num[0]==2) {
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");//设置日期格式
text.setText("时间:"+df.format(new Date()));// new Date()为获取当前系统时间
}
else {
text.setText(text.getText()+t.getText());
}
}
});
f.add(t);
}
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//界面关闭后程序结束
f.setVisible(true);//界面可视化。
}
//检查括号匹配情况,括号合理返回true,否则返回false
public static boolean checkBracket(char exp[], int n) {
char[] stack = new char[n];
int top = -1;
for(int i = 0; i<n; i++) {
if(exp[i]=='(') {
stack[++top] = '(';
}else if(exp[i]==')') {
if(top==-1)
return false;
else
top--;
}
}
if(top==-1)
return true;
else
return false;
}
//获取符号优先级
public static int priority(char a) {
switch (a) {
case '(':
case ')':
return 0;
case '-':
case '+':
return 1;
case '×':
case '÷':
return 2;
default:
return -1;
}
}
//计算
public static int compute(String op, int num1, int num2) {
switch (op) {
case "-":
return num1 - num2;
case "+":
return num1 + num2;
case "×":
return num1 * num2;
case "÷":
return num1 / num2;
default:
return 0;
}
}
//转为后缀表达式后计算,网上很多就不细说了
public static int calculate(char exp[], int n) {
char[] stack = new char[n];
String[] list = new String[n];
int stop = -1, ltop = -1;
for(int i=0; i<n; i++) {
if(Character.isDigit(exp[i])) {
String s = String.valueOf(exp[i]);
while(i<n-1&&Character.isDigit(exp[i+1])) {
s += String.valueOf(exp[i+1]);
i++;
}
list[++ltop] = s;
}else if(exp[i]=='('||stop==-1) {
stack[++stop] = exp[i];
}else if(exp[i]==')') {
while(stack[stop]!='(') {
list[++ltop] = String.valueOf(stack[stop--]);
}
stop--;
}else if(priority(exp[i])>priority(stack[stop])) {
stack[++stop] = exp[i];
}else if(priority(exp[i])<=priority(stack[stop])) {
while(priority(exp[i])<=priority(stack[stop])) {
list[++ltop] = String.valueOf(stack[stop--]);
if(stop==-1)
break;
}
stack[++stop] = exp[i];
}
}
while(stop!=-1) {
list[++ltop] = String.valueOf(stack[stop--]);
}
//开始计算后缀表达式
int[] data = new int[n];
int top = -1, res = 0;
for(int i=0; i<n&&list[i]!=null; i++) {
if(Character.isDigit(list[i].charAt(0))) {
data[++top] = Integer.parseInt(list[i]);
}else {
res = compute(list[i], data[top-1], data[top]);
data[--top] = res;
}
}
return data[0];
}
}