小型计算器




这个计算器的功能有:
1.十进制的四则运算和平方
2.进制间的转换

代码如下:


import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.JTextField;

public class MainFrame extends JFrame implements ActionListener {
// 文本框内容存储
private StringBuilder sbValue = new StringBuilder();
// 数值的处理
private long op1, op2, op3, op4 = 0;
private int preOp, currentOp = 0;
// 运算数标记
private int mathMark = 0;
// 判断标记
private boolean flag = true;
// 默认进制为10
private int log = 10;
// 进制转换单选按钮
private JRadioButton jScale16;
private JRadioButton jScale8;
private JRadioButton jScale2;
private JRadioButton jScale10;
// 输入输出文本条
private JTextField tf;
// + - * / 运算符
private JButton jOperator;
// 平方运算
private JButton jSqrt;
// 1-9 a-f 按钮

private JButton jNum;

private JButton[] buts = { jNum, jNum, jNum, jNum, jNum, jNum, jNum, jNum, jOperator, jNum,
jNum jNum, jNum, jOperator, jSqrt, jNum, jNum, jNum, jOperator, jOperator, jNum,
jOperator, jOperator, jOperator, jOperator };
private String[] strs = { "a", "c", "c", "d", "e", "7", "8", "9", "/", "f",
"4", "5", "6", "*", "sqrt", "1", "2", "3", "-", "CE", "0", "+/-",
".", "+", "=" };

public MainFrame() {
init();
}

private void init() {
setBounds(400, 160, 460, 280);
setContentPane(createContentpane());
// 设置按钮状态
setStates(10);
}

// 主面板
private JPanel createContentpane() {
// TODO Auto-generated method stub
JPanel p = new JPanel(new BorderLayout());
// 1.创建 菜单面板
p.add(BorderLayout.NORTH, createTitleMenu());

// 2.创建 计算面板
p.add(BorderLayout.CENTER, createCountPanel());

// 3.创建软件信息面板
p.add(BorderLayout.SOUTH, createInfoPanel());
return p;
}

// 3.创建软件信息面板
private JLabel createInfoPanel() {
// TODO Auto-generated method stub
JLabel l = new JLabel("科学计算器", JLabel.RIGHT);
return l;
}

// 1.创建 菜单面板
private JMenuBar createTitleMenu() {
// TODO Auto-generated method stub
JMenuBar m = new JMenuBar();
m.add(createMenu());
return m;
}

// 1.1 菜单
private JMenu createMenu() {
// TODO Auto-generated method stub
JMenu menu = new JMenu("查看");
return menu;
}

// 2.创建 计算面板
private JPanel createCountPanel() {
JPanel p = new JPanel(new BorderLayout());
p.add(BorderLayout.NORTH, createTextField());
p.add(BorderLayout.CENTER, createMathPanel());
return p;
}

// 2.1 输入框
private JTextField createTextField() {
tf = new JTextField("0.", 26);

// 文本对齐为右对齐,即光标在右
tf.setHorizontalAlignment(JTextField.RIGHT);

// 文本条不可输入
tf.setEditable(false);
return tf;
}

// 数字按钮
// 主计算按钮
private JPanel createMathPanel() {
JPanel p = new JPanel(new BorderLayout());

p.add(BorderLayout.CENTER, createValuePanel());
p.add(BorderLayout.NORTH, createToolPanel());

return p;
}

// 进制面板
private JPanel createToolPanel() {
JPanel p = new JPanel(new BorderLayout());
p.add(createScaleJButton());
return p;
}

// 进制转换按钮
private JPanel createScaleJButton() {
JPanel p = new JPanel(new GridLayout(1, 4, 3, 0));

ButtonGroup bg = new ButtonGroup();
// 十六
jScale16 = new JRadioButton("十六进制");
setJRadioButtonPrperties(jScale16);
bg.add(jScale16);
p.add(jScale16);
// 八
jScale8 = new JRadioButton("八进制");
setJRadioButtonPrperties(jScale8);
bg.add(jScale8);
p.add(jScale8);
// 二
jScale2 = new JRadioButton("二进制");
setJRadioButtonPrperties(jScale2);
bg.add(jScale2);
p.add(jScale2);
// 十
jScale10 = new JRadioButton("十进制", true);
setJRadioButtonPrperties(jScale10);
bg.add(jScale10);
p.add(jScale10);
return p;
}

private void setJRadioButtonPrperties(JRadioButton jRB) {
jRB.setForeground(Color.red);
jRB.setMargin(new Insets(3, 3, 3, 3));
jRB.addActionListener(this);
}

// 生成并设置面板所有按钮
private JPanel createValuePanel() {
JPanel p = new JPanel();
p.setLayout(new GridLayout(5, 5, 3, 2));
// 自动生成所有按钮
createAndSetButton(p);
return p;
}

// 自动生成所有按钮
private void createAndSetButton(JPanel p) {
for (int x = 0; x < 25; x++) {
buts[x] = new JButton(strs[x]);
// 设置按钮属性
setButtonPrperties(buts[x], strs[x]);
p.add(buts[x]);
}

}

// 设置按钮属性
private void setButtonPrperties(JButton jBut, String str) {
if (str.matches("\\d")) {
jBut.setForeground(Color.blue);
} else if (str.matches("[a-f]")) {
jBut.setForeground(Color.black);
} else {
jBut.setForeground(Color.red);
}

jBut.setMargin(new Insets(3, 3, 3, 3));
jBut.addActionListener(this);
}

/**
* 所有按钮事件监听
*/
public void actionPerformed(ActionEvent e) {
// 获取 按钮的 value
String value = e.getActionCommand();

if (value.equals("+")) {
mathMark = 1;
mathOperator(mathMark);
} else if (value.equals("-")) {
mathMark = 2;
mathOperator(mathMark);
} else if (value.equals("*")) {
mathMark = 3;
mathOperator(mathMark);
} else if (value.equals("/")) {
mathMark = 4;
mathOperator(mathMark);
} else if (value.equals("=")) {
mathMark = 5;
mathOperator(mathMark);
} else if (value.equals("sqrt")) {
mathMark = 6;
mathOperator(mathMark);
} else if (value.equals("CE")) {
ceOperator();
} else if (value.equals("十六进制")) {
toHexOperator();
log = 16;
} else if (value.equals("八进制")) {
toOctalOperator();
log = 8;
} else if (value.equals("二进制")) {
toBinaryOperator();
log = 2;
} else if (value.equals("十进制")) {
toShiOperator();
} else if (value.matches("\\w")) {
// 0-9 的数字转换
numOperator(value);
}
}

// 0-9 的数字转换
// 数值操作
private void numOperator(String value) {
if (value.equals("0")) {
if (tf.getText().equals("0.")) {
tf.setText("0.");
} else {
if (log != 10) {
tf.setText(sbValue.append(value).toString());
} else {
tf.setText(sbValue.append(value).toString());
op2 = Long.parseLong(tf.getText().trim());
op1 = op2;
op3 = op1;
}
System.out.println("op2..值0.." + op2);
}
} else {
if (log == 16) {
tf.setText(sbValue.append(value).toString());
} else if (log == 8 ) {
tf.setText(sbValue.append(value).toString());
} else if (log == 2) {
tf.setText(sbValue.append(value).toString());
} else {
tf.setText(sbValue.append(value).toString());
op2 = Long.parseLong(tf.getText().trim());
System.out.println(op2);
if (currentOp == 0) {
op1 = op2;
op3 = op1;
}
}
}
}

// 10进制
private void toShiOperator() {
setStates(10);
if (!tf.getText().trim().equals("0.")) {
scale();
}
if (op3 != 0) {

if (sbValue.length() != 0) {

System.out.println("转十进制的op3是。。。" + op3);
tf.setText(Long.toString(op3));
} else {
tf.setText("0.");
sbValue.setLength(0);
}
}
}

// 2进制
private void toBinaryOperator() {
flag = false;
setStates(2);
if (!tf.getText().trim().equals("0.")) {
scale();
if (op3 != 0) {

if (sbValue.length() != 0) {
tf.setText(Long.toBinaryString(op3));
} else {
tf.setText("0.");
sbValue.setLength(0);
}
}
}
}

// 8进制
private void toOctalOperator() {
setStates(8);
if (!tf.getText().trim().equals("0.")) {
scale();
if (op3 != 0) {
if (sbValue.length() != 0) {
// System.out.println("转八进制的op3是。。。" + op3);
tf.setText(Long.toOctalString(op3));
} else {
tf.setText("0.");
sbValue.setLength(0);
}
}
}
}

// 16进制
private void toHexOperator() {
setStates(16);
if (!tf.getText().trim().equals("0.")) {
scale();
if (op3 != 0) {
if (sbValue.length() != 0) {
// System.out.println("转十六进制的op3是。。。" + op3);
tf.setText(Long.toHexString(op3));
} else {
tf.setText("0.");
sbValue.setLength(0);
}
}
}
}

// 进制
private void scale() {
if (op4 == 0) {
if (log == 16) {
op4 = Long.parseLong(tf.getText(), 16);
tf.setText(Long.toString(op3));
} else if (log == 8 ) {
op4 = Long.parseLong(tf.getText(), 8 );
tf.setText(Long.toString(op3));
} else if (log == 2 ) {
op4 = Long.parseLong(tf.getText(), 2 );
tf.setText(Long.toString(op3));
} else {
if (tf.getText().equals("0.")) {
} else {
op4 = Long.parseLong(tf.getText());
}
}
op3 = op4;
}
}

// 清空,回到初始化状态
private void ceOperator() {
tf.setText("0.");
sbValue.delete(0, sbValue.length());
jScale10.setSelected(true);
op3 = op4 = op1 = op2 = 0;
log = 10;
preOp = 0;
currentOp = 0;
flag = true;
mathMark = 0;
setStates(10);
}

// 数学运算
private void mathOperator(int mark) {
if (mark == 5) {
if (currentOp == 0) {
sbValue.setLength(0);
tf.setText("" + op2);

} else {
sbValue.setLength(0);
currentOp = preOp;
select(currentOp);
}
} else if (mark == 6) {
if (!tf.getText().trim().equals("0.")) {
long op5 = op3 * op3;
tf.setText(op5 + "");
op3 = op5;
sbValue.setLength(0);
}
} else {
sbValue.setLength(0);
if (currentOp == 0) {
preOp = currentOp = mark;
tf.setText("" + op1);
} else {
currentOp = preOp;
preOp = mark;
select(currentOp);
}
}
}

private void select(int opCurrent) {
switch (opCurrent) {
case 1:
op1 = op1 + op2;
tf.setText("" + op1);
op3 = op1;
break;
case 2:
op1 = op1 - op2;
tf.setText("" + op1);
op3 = op1;
break;
case 3:
op1 = op1 * op2;
tf.setText("" + op1);
op3 = op1;
break;
case 4:
op1 = op1 / op2;
tf.setText("" + op1);
op3 = op1;
break;
}
}

// 改变按钮状态
private void setStates(int logValue) {
for (int x = 0; x < 25; x++) {
if (logValue == 10) {
buts[x].setEnabled(true);
if (strs[x].matches("[a-f]")) {
buts[x].setEnabled(false);
}
} else if (logValue == 16 ) {
buts[x].setEnabled(true);
} else if (logValue == 8 ) {
buts[x].setEnabled(true);
if (strs[x].matches("[8-9 a-f]")) {
buts[x].setEnabled(false);
}
} else if (logValue == 2) {
buts[x].setEnabled(true);
if (strs[x].matches("[2-9 a-f]")) {
buts[x].setEnabled(false);
}
}
}
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值