import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JTextField;
/**
* 一个计算器,与Windows附件自带计算器的标准版功能、界面相仿。 但还不支持键盘操作。
*/
public class Calculator {
//计算器按钮显示文本
String[] btntext= {"MC", "MR", "MS", "M+", "%", "√", "x^2", "1/x", "CE", "C", "Bak", "÷",
"7", "8", "9", "x", "4", "5", "6", "-", "1", "2", "3", "+",
"+/-", "0", ".", "=",};
//放置结果文本域
JTextField resultText=new JTextField();
// 标志用户按的是否是整个表达式的第一个数字,或者是运算符后的第一个数字
private boolean firstDigit = true;
// 计算的中间结果。
private double resultNum = 0.0;
// 当前运算的运算符
private String operator = "=";
// 操作是否合法
private boolean operateValidFlag = true;
/**
* 获取计算器面板
* @return 计算器面板
*/
public JPanel getCalculator() {
JPanel jp=new JPanel();
jp.setLayout(new BorderLayout());//设置布局
resultText.setText("0");
jp.add(resultText, BorderLayout.NORTH);
//放置所有操作按钮
JPanel opt=new JPanel();
opt.setLayout(new GridLayout(7, 4));
for(String str : btntext) {
JButton btn=new JButton(str);
btn.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// 获取事件源的标签
String label = e.getActionCommand();
if (label.equals("Bak")) {
// 用户按了"Backspace"键
handleBackspace();
} else if (label.equals("CE")) {
// 用户按了"CE"键
resultText.setText("0");
} else if (label.equals("C")) {
// 用户按了"C"键
handleC();
} else if ("0123456789.".indexOf(label) >= 0) {
// 用户按了数字键或者小数点键
handleNumber(label);
// handlezero(zero);
} else {
// 用户按了运算符键
handleOperator(label);
}
}
});
opt.add(btn);
}
jp.add(opt, BorderLayout.CENTER);
return jp;
}
/**
* 处理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);
}
}
}
/**
* 处理数字键被按下的事件
*
* @param key
*/
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;
}
/**
* 处理C键被按下的事件
*/
private void handleC() {
// 初始化计算器的各种值
resultText.setText("0");
firstDigit = true;
operator = "=";
}
/**
* 处理运算符键被按下的事件
*
* @param key
*/
private void handleOperator(String key) {
if (operator.equals("÷")) {
// 除法运算
// 如果当前结果文本框中的值等于0
if (getNumberFromText() == 0.0) {
// 操作不合法
operateValidFlag = false;
resultText.setText("除数不能为零");
} else {
resultNum /= getNumberFromText();
}
} else if (operator.equals("1/x")) {
// 倒数运算
if (resultNum == 0.0) {
// 操作不合法
operateValidFlag = false;
resultText.setText("零没有倒数");
} else {
resultNum = 1 / resultNum;
}
} else if (operator.equals("+")) {
// 加法运算
resultNum += getNumberFromText();
} else if (operator.equals("-")) {
// 减法运算
resultNum -= getNumberFromText();
} else if (operator.equals("x")) {
// 乘法运算
resultNum *= getNumberFromText();
}else if (operator.equals("x^2")) {
resultNum *= resultNum;
} else if (operator.equals("√")) {
// 平方根运算
resultNum = Math.sqrt(resultNum);
} else if (operator.equals("%")) {
// 百分号运算,除以100
resultNum = resultNum / 100;
} else if (operator.equals("+/-")) {
// 正数负数运算
resultNum = resultNum * (-1);
} else if (operator.equals("=")) {
// 赋值运算
resultNum = getNumberFromText();
}
if (operateValidFlag) {
// 双精度浮点数的运算
long t1;
double t2;
t1 = (long) resultNum;
t2 = resultNum - t1;
if (t2 == 0) {
resultText.setText(String.valueOf(t1));
} else {
resultText.setText(String.valueOf(resultNum));
}
}
// 运算符等于用户按的按钮
operator = key;
firstDigit = true;
operateValidFlag = true;
}
/**
* 从结果文本框中获取数字
*
* @return
*/
private double getNumberFromText() {
double result = 0;
try {
result = Double.valueOf(resultText.getText()).doubleValue();
} catch (NumberFormatException e) {
}
return result;
}
}
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Pattern;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.JToolBar;
public class Convert {
private static Map toolbarmap = new HashMap();
private static String[][] conrate=null;
private static JLabel jl=new JLabel();//显示标题
private static JComboBox convert=new JComboBox();
private static JComboBox converted=new JComboBox();
private static JTextField tconvert=new JTextField();
private static JTextField tconverted=new JTextField();
static {
tconverted.setEditable(false);
/*
* 厘米 分米 米 千米(输入项)
* 厘米 1 10 100 100000
* 分米 0.1 1 10 10000
* 米 0.01 0.1 1 1000
* 千米 0.00001 0.0001 0.001 1
*/
String[][] len = new String[4][5];
len[0] = new String[5];
len[1] = new String[5];
len[2] = new String[5];
len[3] = new String[5];
len[0][0]="厘米";
len[1][0]="分米";
len[2][0]="米";
len[3][0]="千米";
len[0][1]="1";
len[1][1]="10";
len[2][1]="100";
len[3][1]="100000";
len[0][2]="0.1";
len[1][2]="1";
len[2][2]="10";
len[3][2]="10000";
len[0][3]="0.01";
len[1][3]="0.1";
len[2][3]="1";
len[3][3]="1000";
len[0][4]="0.00001";
len[1][4]="0.0001";
len[2][4]="0.001";
len[3][4]="1";
toolbarmap.put("长度(L)", len);
/*
* 平方厘米 平方分米 平方米(输入项)
* 平方厘米 1 100 10000
* 平方分米 0.01 1 100
* 平方米 0.0001 0.01 1
*/
String[][] area = new String[3][4];
area[0] = new String[4];
area[1] = new String[4];
area[2] = new String[4];
area[0][0]="平方厘米";
area[1][0]="平方分米";
area[2][0]="平方米";
area[0][1]="1";
area[1][1]="100";
area[2][1]="10000";
area[0][2]="0.01";
area[1][2]="1";
area[2][2]="100";
area[0][3]="0.0001";
area[1][3]="0.01";
area[2][3]="1";
toolbarmap.put("面积(S)", area);
/*
* 立方厘米 立方分米 立方米(输入项)
* 立方厘米 1 1000 100000
* 立方分米 0.001 1 1000
* 立方米 0.000001 0.001 1
*/
String[][] vol = new String[3][4];
vol[0] = new String[4];
vol[1] = new String[4];
vol[2] = new String[4];
vol[0][0]="立方厘米";
vol[1][0]="立方分米";
vol[2][0]="立方米";
vol[0][1]="1";
vol[1][1]="1000";
vol[2][1]="1000000";
vol[0][2]="0.001";
vol[1][2]="1";
vol[2][2]="1000";
vol[0][3]="0.000001";
vol[1][3]="0.001";
vol[2][3]="1";
toolbarmap.put("体积(V)", vol);
/*
* 摄氏度 华氏度 开尔文(输入项)
* 摄氏度 1 -17.2222 -272.15
* 华氏度 33.8 1 -475.87
* 开尔文 274.15 255.9278 1
*/
String[][] temperature = new String[3][4];
temperature[0] = new String[4];
temperature[1] = new String[4];
temperature[2] = new String[4];
temperature[0][0]="摄氏度";
temperature[1][0]="华氏度";
temperature[2][0]="开尔文";
temperature[0][1]="1";
temperature[1][1]="-17.2222";
temperature[2][1]="-272.15";
temperature[0][2]="33.8";
temperature[1][2]="1";
temperature[2][2]="-475.87";
temperature[0][3]="274.15";
temperature[1][3]="255.9278";
temperature[2][3]="1";
toolbarmap.put("温度(K)", temperature);
/*
* 焦耳 千焦耳 卡路里(输入项)
* 焦耳 1 1000 4.184
* 千焦耳 0.001 1 0.004184
* 卡路里 0.239006 239.0057 1
*/
String[][] heat = new String[3][4];
heat[0] = new String[4];
heat[1] = new String[4];
heat[2] = new String[4];
heat[0][0]="焦耳";
heat[1][0]="千焦耳";
heat[2][0]="卡路里";
heat[0][1]="1";
heat[1][1]="1000";
heat[2][1]="4.184";
heat[0][2]="0.001";
heat[1][2]="1";
heat[2][2]="0.004184";
heat[0][3]="0.239006";
heat[1][3]="239.0057";
heat[2][3]="1";
toolbarmap.put("能量(Q)", heat);
/*
* 度 弧度 百分度(输入项)
* 度 1 57.29578 0.9
* 弧度 0.017453 1 0.015708
* 百分度 1.111111 63.66198 1
*/
String[][] ang = new String[3][4];
ang[0] = new String[4];
ang[1] = new String[4];
ang[2] = new String[4];
ang[0][0]="度";
ang[1][0]="弧度";
ang[2][0]="百分度";
ang[0][1]="1";
ang[1][1]="57.29578";
ang[2][1]="0.9";
ang[0][2]="0.017453";
ang[1][2]="1";
ang[2][2]="0.015708";
ang[0][3]="1.111111";
ang[1][3]="63.66198";
ang[2][3]="1";
toolbarmap.put("角度(A)", ang);
/*
* 厘米/秒 米/秒 公里/小时(输入项)
* 厘米/秒 1 100 27.7777777
* 米/秒 0.01 1 0.2777777
* 公里/小时 0.036 3.6 1
*/
String[][] career = new String[3][4];
career[0] = new String[4];
career[1] = new String[4];
career[2] = new String[4];
career[0][0]="厘米/秒";
career[1][0]="米/秒";
career[2][0]="公里/小时";
career[0][1]="1";
career[1][1]="100";
career[2][1]="27.7777777";
career[0][2]="0.01";
career[1][2]="1";
career[2][2]="0.2777777";
career[0][3]="0.036";
career[1][3]="3.6";
career[2][3]="1";
toolbarmap.put("速度(R)", career);
/*
* 巴 帕 千帕(输入项)
* 巴 1 0.00001 0.01
* 帕 100000 1 1000
* 千帕 100 0.001 1
*/
String[][] press = new String[3][4];
press[0] = new String[4];
press[1] = new String[4];
press[2] = new String[4];
press[0][0]="巴";
press[1][0]="帕";
press[2][0]="千帕";
press[0][1]="1";
press[1][1]="0.00001";
press[2][1]="0.01";
press[0][2]="100000";
press[1][2]="1";
press[2][2]="1000";
press[0][3]="100";
press[1][3]="0.001";
press[2][3]="1";
toolbarmap.put("压力(P)", press);
/*
* 克 千克 吨 磅(输入项)
* 克 1 1000 1000000 453.5924
* 千克 0.001 1 1000 0.453592
* 吨 0.000001 0.001 1 0.000454
* 磅 0.002205 2.204623 2204.623 1
*/
String[][] qua = new String[4][5];
qua[0] = new String[5];
qua[1] = new String[5];
qua[2] = new String[5];
qua[3] = new String[5];
qua[0][0]="克";
qua[1][0]="千克";
qua[2][0]="吨";
qua[3][0]="磅";
qua[0][1]="1";
qua[1][1]="1000";
qua[2][1]="1000000";
qua[3][1]="453.5924";
qua[0][2]="0.001";
qua[1][2]="1";
qua[2][2]="1000";
qua[3][2]="0.453592";
qua[0][3]="0.000001";
qua[1][3]="0.001";
qua[2][3]="1";
qua[3][3]="0.000454";
qua[0][4]="0.002205";
qua[1][4]="2.204623";
qua[2][4]="2204.623";
qua[3][4]="1";
toolbarmap.put("重量(M)", qua);
/*
* 瓦特 千瓦 马力(输入项)
* 瓦特 1 1000 745.6999
* 千瓦 0.001 1 0.7457
* 马力 0.001341022 1.341022 1
*/
String[][] ele = new String[3][4];
ele[0] = new String[4];
ele[1] = new String[4];
ele[2] = new String[4];
ele[0][0]="瓦特";
ele[1][0]="千瓦";
ele[2][0]="马力";
ele[0][1]="1";
ele[1][1]="1000";
ele[2][1]="745.6999";
ele[0][2]="0.001";
ele[1][2]="1";
ele[2][2]="0.7457";
ele[0][3]="0.001341022";
ele[1][3]="1.341022";
ele[2][3]="1";
toolbarmap.put("功率(W)", ele);
/*
* 元 美元 欧元(输入项)
* 元 1 6.91 7.81
* 美元 0.14 1 1.13
* 欧元 0.13 0.88 1
*/
String[][] dol = new String[3][4];
dol[0] = new String[4];
dol[1] = new String[4];
dol[2] = new String[4];
dol[0][0]="元";
dol[1][0]="美元";
dol[2][0]="欧元";
dol[0][1]="1";
dol[1][1]="6.91";
dol[2][1]="7.81";
dol[0][2]="0.14";
dol[1][2]="1";
dol[2][2]="1.13";
dol[0][3]="0.13";
dol[1][3]="0.88";
dol[2][3]="1";
toolbarmap.put("货币(¥)", dol);
}
/**
* 获取计算器面板
*
* @return 计算器面板
*/
public JPanel getConvert() {
JPanel jp = new JPanel();
jp.setLayout(new BorderLayout());// 设置布局
JToolBar jtb = new JToolBar();
jtb.setFloatable(true);
//jtb.setOrientation(SwingConstants.HORIZONTAL);
for (String str : toolbarmap.keySet()) {
JButton jb = new JButton(str);
jb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
setopcentext(str);
}
});
jtb.add(jb);
}
jp.add(jtb, BorderLayout.NORTH);
//添加中央显示面板
setopcentext("长度(L)");
JPanel center=new JPanel();
center.setLayout(new GridLayout(6, 1));
center.add(jl);
center.add(convert);
center.add(tconvert);
center.add(converted);
center.add(tconverted);
//单位换算提交按钮
JButton sure=new JButton("确定");
//添加点击事件监听事件
sure.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
double rate=Double.parseDouble(conrate[convert.getSelectedIndex()][converted.getSelectedIndex()+1]);
String in=tconvert.getText();
String pattern = "^(\\-|\\+)?\\d+(\\.\\d+)?$";
double i=0.0;
if(Pattern.matches(pattern, in)) {
i=Double.parseDouble(in);
tconverted.setText(Double.toString(rate*i));
}else tconverted.setText("请输入正确的数字格式");
}
});
center.add(sure, BorderLayout.SOUTH);
jp.add(center);
return jp;
}
/**
* 设置操作项文本,下拉选项等
* @param type 操作类型 长度等
*/
private void setopcentext(String type) {
convert.removeAllItems();
converted.removeAllItems();
conrate=toolbarmap.get(type);
jl.setText(type);
for(String[] s : conrate) {
convert.addItem(s[0]);
converted.addItem(s[0]);
};
}
}
import java.awt.BorderLayout;
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.JPanel;
public class MyCalculator extends JFrame {
private static final long serialVersionUID = 1L;
public MyCalculator() {
super("计算器");
JFrame jframe=this;
this.setLayout(new BorderLayout());
//添加计算器面板
JPanel pcal=new Calculator().getCalculator();
JPanel pcon=new Convert().getConvert();
this.getContentPane().add(pcal, BorderLayout.CENTER);
//this.getContentPane().add(pcon, BorderLayout.CENTER);
//计算器,单位转换操作按钮
JPanel btn=new JPanel();
btn.setLayout(new GridLayout(1, 2));
JButton cal=new JButton("计算器");
cal.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
pcon.setVisible(false);
pcal.setVisible(true);
jframe.getContentPane().add(pcal, BorderLayout.CENTER);
}
});
JButton con=new JButton("单位转换");
con.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
pcon.setVisible(true);
pcal.setVisible(false);
jframe.getContentPane().add(pcon, BorderLayout.CENTER);
}
});
btn.add(cal);
btn.add(con);
this.add(btn, BorderLayout.SOUTH);
//设置窗体属性
this.setVisible(true);
this.setBounds(100, 100, 634, 300);//设置窗体的位置和大小
}
public static void main(String[] args) {
new MyCalculator();
}
}
好了,完成了,欢迎加群QQ讨论 517413713