一、设计布局
private String[] function = {"+", "-", "*", "/", "7", "8", "9", "<-", "4", "5", "6", "C", "1", "2", "3", "=", ".", "0", "=", "=",};
如上就是我设计的按钮布局。
二、窗口设置及输入框。
//输入框面板
JPanel jPane1 = new JPanel();
this.add(jPane1);
//键盘面板
JPanel jPane2 = new JPanel(new GridLayout(5, 4));//
ButtonAction a = new ButtonAction();
KeyAction b = new KeyAction();
for (int i = 0; i < x; i++) {
jButton[i] = new JButton(function[i]);
jButton[i].addActionListener(a);
jButton[i].addKeyListener(b);
jPane2.add(jButton[i]);
//按钮大小
Font font = new Font("Computer", Font.BOLD, 28);
jButton[i].setFont(font);
}
//组装
//输入组件rgb颜色
jPane1.setBackground(new Color(255, 255, 255));
//输入框位置
this.add(jPane1, BorderLayout.NORTH);
this.add(jPane2, BorderLayout.CENTER);
jPane1.add(jTextField, BorderLayout.WEST);
this.setVisible(true);
this.setBounds(0, 0, 400, 350);
}
菜单设置
//菜单栏
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenu1 = new JMenu("菜单");
JMenuItem jMenuItem1 = new JMenuItem("帮助");
JMenuItem jMenuItem2 = new JMenuItem("科学计算器");
JMenuItem jMenuItem3 = new JMenuItem("打开新的计算器");
jMenu1.add(jMenuItem1);
//添加分割线
jMenu1.addSeparator();
jMenu1.add(jMenuItem2);
jMenu1.addSeparator();
jMenu1.add(jMenuItem3);
jMenuBar.add(jMenu1);
this.setJMenuBar(jMenuBar);
三、事件源的响应
//输入框面板
JPanel jPane1 = new JPanel();
this.add(jPane1);
//键盘面板
JPanel jPane2 = new JPanel(new GridLayout(5, 4));//
ButtonAction a = new ButtonAction();
KeyAction b = new KeyAction();
for (int i = 0; i < x; i++) {
jButton[i] = new JButton(function[i]);
jButton[i].addActionListener(a);
jButton[i].addKeyListener(b);
jPane2.add(jButton[i]);
//按钮大小
Font font = new Font("Computer", Font.BOLD, 28);
jButton[i].setFont(font);
}
//组装
//输入组件rgb颜色
jPane1.setBackground(new Color(255, 255, 255));
//输入框位置
this.add(jPane1, BorderLayout.NORTH);
this.add(jPane2, BorderLayout.CENTER);
jPane1.add(jTextField, BorderLayout.WEST);
this.setVisible(true);
this.setBounds(0, 0, 400, 350);
}
四、核心算法,计算过程
//计算算法
public void calculate(double a) {
if (symbol.equals("-"))
num -= a;
else if (symbol.equals("+"))
num += a;
else if (symbol.equals("/"))
num /= a;
else if (symbol.equals("*"))
num *= a;
else if (symbol.equals("="))
num = a;
jTextField.setText("" + num);
}
五、窗口初始化
//创建程序
public static void main(String[] args) {
new jiSuanqi();
}
private class KeyAction extends KeyAdapter {
public void keyTyped(KeyEvent e) {
char key = e.getKeyChar();
if (key == '0' || key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key == '7' || key == '8' || key == '9') {
if (flag) {
jTextField.setText("");
flag = false;
}
jTextField.setText(jTextField.getText() + key);
} else if (key == '+' || key == '-' || key == '/' || key == '*') {
if (flag) {
if (key == '-') {
jTextField.setText(String.valueOf(key));
flag = false;
} else
symbol = String.valueOf(key);
} else {
calculate(Double.parseDouble(jTextField.getText()));
symbol = String.valueOf(key);
flag = true;
}
}
}
}
六、完整代码
package JISUANQI;
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
class jiSuanqi extends JFrame {
private String[] function = {"+", "-", "*", "/", "7", "8", "9", "<-", "4", "5", "6", "C", "1", "2", "3", "=", ".", "0", "=", "=",};
int x = function.length;
JButton[] jButton = new JButton[x];
private double num = 0;
//累加器
private String symbol = "=";
//判断标志
private boolean flag = true;
//文本框大小
private JTextField jTextField = new JTextField(25);
public jiSuanqi() {
//菜单栏
JMenuBar jMenuBar = new JMenuBar();
JMenu jMenu1 = new JMenu("菜单");
JMenuItem jMenuItem1 = new JMenuItem("帮助");
JMenuItem jMenuItem2 = new JMenuItem("科学计算器");
JMenuItem jMenuItem3 = new JMenuItem("打开新的计算器");
jMenu1.add(jMenuItem1);
//添加分割线
jMenu1.addSeparator();
jMenu1.add(jMenuItem2);
jMenu1.addSeparator();
jMenu1.add(jMenuItem3);
jMenuBar.add(jMenu1);
this.setJMenuBar(jMenuBar);
//输入框面板
JPanel jPane1 = new JPanel();
this.add(jPane1);
//键盘面板
JPanel jPane2 = new JPanel(new GridLayout(5, 4));//
ButtonAction a = new ButtonAction();
KeyAction b = new KeyAction();
for (int i = 0; i < x; i++) {
jButton[i] = new JButton(function[i]);
jButton[i].addActionListener(a);
jButton[i].addKeyListener(b);
jPane2.add(jButton[i]);
//按钮大小
Font font = new Font("Computer", Font.BOLD, 28);
jButton[i].setFont(font);
}
//组装
//输入组件rgb颜色
jPane1.setBackground(new Color(255, 255, 255));
//输入框位置
this.add(jPane1, BorderLayout.NORTH);
this.add(jPane2, BorderLayout.CENTER);
jPane1.add(jTextField, BorderLayout.WEST);
this.setVisible(true);
this.setBounds(0, 0, 400, 350);
}
//监听运算
private class ButtonAction implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
String input = e.getActionCommand();
if (input.equals("C")) {
String m = jTextField.getText();
m = "";
jTextField.setText(m);
} else if (input.equals("<-")) {
String a = jTextField.getText();
int b = a.length() - 1;
jTextField.setText(a.substring(0, b));
if (jTextField.getText().length() == 0) {
jTextField.setText(" ");
}
} else if (input.equals("-") || input.equals("+") || input.equals("=") || input.equals("/") ||
input.equals("*")) {
if (flag) {
if (input.equals("-")) {
jTextField.setText(input);
flag = false;
} else
symbol = input;
} else {
calculate(Double.parseDouble(jTextField.getText()));
symbol = input;
flag = true;
}
} else {
if (flag) {
jTextField.setText("");
flag = false;
}
jTextField.setText(jTextField.getText() + input);
}
}
}
//计算算法
public void calculate(double a) {
if (symbol.equals("-"))
num -= a;
else if (symbol.equals("+"))
num += a;
else if (symbol.equals("/"))
num /= a;
else if (symbol.equals("*"))
num *= a;
else if (symbol.equals("="))
num = a;
jTextField.setText("" + num);
}
//创建程序
public static void main(String[] args) {
new jiSuanqi();
}
private class KeyAction extends KeyAdapter {
public void keyTyped(KeyEvent e) {
char key = e.getKeyChar();
if (key == '0' || key == '1' || key == '2' || key == '3' || key == '4' || key == '5' || key == '6' || key == '7' || key == '8' || key == '9') {
if (flag) {
jTextField.setText("");
flag = false;
}
jTextField.setText(jTextField.getText() + key);
} else if (key == '+' || key == '-' || key == '/' || key == '*') {
if (flag) {
if (key == '-') {
jTextField.setText(String.valueOf(key));
flag = false;
} else
symbol = String.valueOf(key);
} else {
calculate(Double.parseDouble(jTextField.getText()));
symbol = String.valueOf(key);
flag = true;
}
}
}
}
}
七、运行结果