- 创建计算类
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<String, String[][]> toolbarmap = new HashMap<String, String[][]>(); private static String[][] conrate=null; private static JLabel jl=new JLabel();//显示标题 private static JComboBox<String> convert=new JComboBox<String>(); private static JComboBox<String> converted=new JComboBox<String>(); 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