package Calculator;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
public class Calculatorface extends JFrame {
private JTextField textField;//单行文本输入框
private ActionListener myListener;//监听机
//表面
public Calculatorface() {
setTitle("计算器"); // 设置名字
setSize(400, 400); // 设置大小
setLocationRelativeTo(null); // 设置位置为居中
setResizable(false); // 设置为大小不可变
setDefaultCloseOperation(EXIT_ON_CLOSE); // 可以退出
Container container = getContentPane(); // 新建一个容器
container.setLayout(new BorderLayout(5, 5)); // 设置左右间距为5像素
JPanel panelall = new JPanel(); // 设置总体大面板
JPanel panel = new JPanel(); //设置下方小面板
JPanel panel1 = new JPanel(); //设置下方小面板1
JPanel panel2 = new JPanel(); //设置下方小面板2
container.add(panelall); // 把大面板放到容器上
panelall.setLayout(new BorderLayout(5, 5)); // 设置为边界布局
panel.setLayout(new BorderLayout(5, 5)); // 设置为边界布局
textField = new JTextField(); // 文本框设置
textField.setFont(new Font("宋体", Font.PLAIN, 20)); //格式
textField.setEditable(false); // 不可修改
textField.setHorizontalAlignment (JTextField.RIGHT); //设置输出右对齐
panelall.add(textField, BorderLayout.NORTH); // 将文本框放到北面
JButton btnback = useButton("Back"); //退格
JButton btnce = useButton("CE"); //清零
btnback.setFont(new Font("微软雅黑",Font.PLAIN, 24)); //设置相关字体
btnce.setFont(new Font("微软雅黑",Font.PLAIN, 24));
panel1.add(btnback,BorderLayout.NORTH); //加到小面板1
panel1.add(btnce,BorderLayout.NORTH);
panel1.setLayout(new GridLayout(1, 2, 3, 3)); //网格布局
String[] titles = {
"7", "8", "9", "/",
"4", "5", "6", "*",
"1", "2", "3", "-",
"0", "~+/-", ".", "+",
"l/x","%","sqrt","="
}; //数字计算
panel2.setLayout(new GridLayout(5, 4, 3, 3)); //网格布局
for (int i = 0; i < titles.length; i++) {
JButton btnNum = useButton(titles[i]);
btnNum.setFont(new Font("微软雅黑",Font.PLAIN, 24));
panel2.add(btnNum);
} //都加到小面板2上去
panel.add("North",panel1); //back ce 加到小面板北面
panel.add("Center",panel2); //数字计算加到小面板 南面
panelall.add("Center",panel); //把小面板加到大面板中心位置
}
//监听
public JButton useButton (final String titles) {
// String.valueof(x) 返回x的字符串表示
JButton button = new JButton(String.valueOf(titles));
if(myListener == null){
myListener = new ActionListener(){
public void actionPerformed(ActionEvent event){
String btnInformation = event.getActionCommand();
char key2 = btnInformation.charAt(0); //目的是使用switch case
action(key2);
}
};
}
button.addActionListener(myListener);
return button;
}
//计算
int len; // 输入长度
String a, b, value; // 第一个输入的,第二个输入的, 结果
char exit = '0'; // 保证 = 有意义
char op = 'n';
boolean flag = false;
// flag 为true的时候进行前面的字符串的清空,后面的第一个字符的输入
// flag 为false的时候进行后面的字符串的输入
private void action(char key2){
String text;
switch(key2){
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '0': //输入数字
if (flag) {
textField.setText(""); //清零
textField.setText(String.valueOf(key2)); //输入key2
flag = false; //继续输入
}
else {
text = textField.getText() + key2; //接前面的输入
textField.setText(text); //设置新的字符串
text = ""; //清空text
}
break;
case '.': //小数点
if("".equals(textField.getText())) //如果前面的字符串为空
break; // 第一个元素不能为.
if(!"".equals(textField.getText())){ // 不为空
text = textField.getText(); //得到当前字符串
len = text.length();
int i = 0;
for(; i<len; i++) {
if('.' == text.charAt(i)) break;
}
if(i<len)
break; // 确认字符串中是否已经存在.
text = textField.getText() + key2;
textField.setText(text); //新的字符串
text = "";
}
break;
case '+':
if(!"".equals(textField.getText())){
if ('n' == op) {
a = textField.getText();
op = '+';
flag = true;
} else {
b = textField.getText();
calculation(a, b);
a = value; //可以继续运算
textField.setText(value);
op = '+';
flag = true;
}
exit = '1';
}
break;
case '-':
if(!"".equals(textField.getText())){
if ('n' == op) {
a = textField.getText();
op = '-';
flag = true;
} else {
b = textField.getText();
calculation(a, b);
a = value;
textField.setText(value);
op = '-';
flag = true;
}
exit = '1';
}
break;
case '*':
if(!"".equals(textField.getText())){
if ('n' == op) {
a = textField.getText();
op = '*';
flag = true;
} else {
b = textField.getText();
calculation(a, b);
a = value;
textField.setText(value);
op = '*';
flag = true;
}
exit = '1';
}
break;
case '/':
if(!"".equals(textField.getText())){
if ('n' == op) {
a = textField.getText();
op = '/';
flag = true;
} else {
b = textField.getText();
calculation(a, b);
a = value;
textField.setText(value);
op = '/';
flag = true;
}
exit = '1';
}
break;
case '%': //取余
if(!"".equals(textField.getText())){
if ('n' == op) {
a = textField.getText();
op = '%';
flag = true;
} else {
b = textField.getText();
calculation(a, b);
a = value;
textField.setText(value);
op = '%';
flag = true;
}
exit = '1';
}
break;
case 'l': //倒数
if(!"".equals(textField.getText())){
text = textField.getText();
text = String.valueOf(1/Float.parseFloat(text));
textField.setText(text);
text="";
}
break;
case 's': //根号
if(!"".equals(textField.getText())){
text = textField.getText();
text = String.valueOf(Math.sqrt(Float.parseFloat(text)));
textField.setText(text);
text="";
}
break;
case '~': //正负数
if(!"".equals(textField.getText())){
text = textField.getText();
text = String.valueOf((-1)*Float.parseFloat(text));
textField.setText(text);
text="";
}
break;
case 'B': //退格
text = textField.getText();
if(!"".equals(text)){
len = text.length();
text = text.substring(0, len-1);
textField.setText(text);
}
text="";
break;
case 'C': //清零
textField.setText("");
break;
case '=': //等于
if('0' == exit){
textField.setText("");
break;
}
if("".equals(textField.getText())) // 排除 7*= 7+= 之类错误
break;
b = textField.getText();
calculation(a, b);
textField.setText(String.valueOf(value));
break;
}
}
//两个数的计算
private void calculation(String a, String b){
double v1 = Double.parseDouble(a);
double v2 = Double.parseDouble(b);
double v=0;
switch(op){
case '+':
v = v1 + v2;
exit = '0';
a = b = null;
op = 'n';
break;
case '-':
v = v1 - v2;
exit = '0';
a = b = null;
op = 'n';
break;
case '*':
v = (v1) * (v2);
exit = '0';
a = b = null;
op = 'n';
break;
case '/':
if(v2==0) break;
v = v1 / v2;
exit = '0';
a = b = null;
op = 'n';
break;
case '%':
if(v2==0) break;
v = v1 % v2;
exit = '0';
a = b = null;
op = 'n';
break;
}
value = String.valueOf(v);
}
//main
public static void main(String[] args) {
new Calculatorface().setVisible(true);
}
}
JAVA学习--基于GUI的简易计算器的设计与实现
最新推荐文章于 2022-06-18 12:21:35 发布