package test;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.Vector;
public class test8 extends JFrame {
JTextField result_TextField;
// 操作数1,为了程序的安全,初值一定要设置,这里我们设置为0。
String str1 = "0";//操作数1
String str2 = "0"; //操作数2
String result = "0"; //运算结果
// 以下k1至k5为状态开关
// 开关1用于选择输入方向,将要写入str1或str2
// 为 1 时写入 str1,为 2时写入 str2
int k1 = 1;
// 开关 2 用于记录符号键的次数
// 如果 k2>1 说明进行的是 2+3-9+8 这样的多符号运算
int k2 = 1;
// 开关3用于标识 str1 是否可以被清 0
// 等于 1 时可以,不等于1时不能被清0
int k3 = 1;
// 开关4用于标识 str2 是否可以被清 0
// 等于 1 时可以,不等于1时不能被清0
int k4 = 1;
// 开关5用于控制小数点可否被录入
// 等于1时可以,不为1时,输入的小数点被丢掉
int k5 = 1;
//开关6用于控制正负号输入
int k6 = 1;
// store的作用类似于寄存器,用于记录是否连续按下符号键
JButton store;
String signal;
//vt 存储之前输入的运算符
Vector vt = new Vector(20, 10);
public test8(){
//创建一个JTextField对象并初始化。
// JTextField用于显示操作和计算结果的文本框。
// 参数 20 表明可以显示 20 列的文本内容
result_TextField = new JTextField(20);
// 清除按钮
JButton clear_Button = new JButton("C");
// 数字键0到9
JButton button0 = new JButton("0");
JButton button1 = new JButton("1");
JButton button2 = new JButton("2");
JButton button3 = new JButton("3");
JButton button4 = new JButton("4");
JButton button5 = new JButton("5");
JButton button6 = new JButton("6");
JButton button7 = new JButton("7");
JButton button8 = new JButton("8");
JButton button9 = new JButton("9");
// 计算命令按钮,加减乘除以及小数点、正负号等
JButton button_Dian = new JButton(".");
JButton button_jia = new JButton("+");
JButton button_jian = new JButton("-");
JButton button_cheng = new JButton("*");
JButton button_chu = new JButton("/");
JButton button_dy = new JButton("=");
JButton button_zhengfu = new JButton("+/-");
// 两个标签
JLabel label1 = new JLabel();
JLabel label2 = new JLabel();
//一个面板
JPanel panel = new JPanel(new GridLayout(5, 4));
//在面板中添加标签和按钮
panel.add(label1); panel.add(label2);
panel.add(clear_Button); panel.add(button_dy);
panel.add(button0); panel.add(button1);
panel.add(button2); panel.add(button_jia);
panel.add(button3); panel.add(button4);
panel.add(button5); panel.add(button_jian);
panel.add(button6); panel.add(button7);
panel.add(button8); panel.add(button_cheng);
panel.add(button9); panel.add(button_zhengfu);
panel.add(button_Dian); panel.add(button_chu);
//0-9添加监听器
button0.addActionListener(new Listener());
button1.addActionListener(new Listener());
button2.addActionListener(new Listener());
button3.addActionListener(new Listener());
button4.addActionListener(new Listener());
button5.addActionListener(new Listener());
button6.addActionListener(new Listener());
button7.addActionListener(new Listener());
button8.addActionListener(new Listener());
button9.addActionListener(new Listener());
//小数点添加监听器
button_Dian.addActionListener(new Listener_xiaos());
//+-*/添加监听器
button_jia.addActionListener(new Listener_signal());
button_jian.addActionListener(new Listener_signal());
button_cheng.addActionListener(new Listener_signal());
button_chu.addActionListener(new Listener_signal());
//等于号添加监听器
button_dy.addActionListener(new Listener_dy());
//清除键添加监听器
clear_Button.addActionListener(new Listener_clear());
//正负号添加监听器
button_zhengfu.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
if(k6 == 1){
k6 = 2;
if(k1 == 1){
str1 = "-" + str1;
result_TextField.setText(str1);
} else if(k1 == 2) {
str2 = "-" + str2;
result_TextField.setText(str2);
}
} else if(k6 == 2){
if(k1 == 1){
str1 = str1.substring(1);
result_TextField.setText(str1);
} else if(k1 == 2) {
str2 = str2.substring(1);
result_TextField.setText(str2);
}
k6 = 1;
}
}
});
this.add(result_TextField, BorderLayout.NORTH);
this.add(panel, BorderLayout.CENTER);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setBounds(300, 300, 300, 400);
this.setVisible(true);
this.setTitle("计算器");
}
//Listener类中编写的是数字键的响应逻辑。
class Listener implements ActionListener {
public void actionPerformed(ActionEvent e) {
String ss = ((JButton)e.getSource()).getText();
store = (JButton)e.getSource();
if(k1 == 1){//输入第一个数
if(k3 == 1){//第一个数可以被清零
str1 = "";
k5 = 1;
}
str1 = str1 + ss;
k3 = k3 + 1;
if(k6 != 1){//正负号的输入
str1 = "-" + str1;
k6 = 1;
}
result_TextField.setText(str1);
} else if (k1 == 2) {
if(k4 == 1){//str2可以被清零
str2 = "";
k5 = 1;//小数点是否可以被输入
}
str2 = str2 + ss;
k4 = k4 + 1;
if(k6 != 1){
str2 = "-" + str2;
k6 = 1;
}
result_TextField.setText(str2);
}
}
}
//Listener_signal类中编写了运算符号键的响应逻辑
class Listener_signal implements ActionListener {
public void actionPerformed(ActionEvent e) {
k6 = 1;
String ss2 = ((JButton)e.getSource()).getText();
store = (JButton)e.getSource();
vt.add(store);
if(k2 == 1){
k1 = 2;
k5 = 1;
signal = ss2;
k2 = k2 + 1;
} else {
int a = vt.size();
JButton c = (JButton)vt.get(a - 2);
if(c.getText().equals("+")||c.getText().equals("-")||c.getText().equals("*")||c.getText().equals("/")){
cal();
str1 = result;
k1 = 2;
k5 = 1;
k4 = 1;
signal = ss2;
}
k2 = k2 + 1;
}
}
}
//Listener_clear类中编写了清除键的响应逻辑
class Listener_clear implements ActionListener {
public void actionPerformed(ActionEvent e) {
result = "0";
str1 = "0";
str2 = "0";
result_TextField.setText("");
k1 = 1;
k2 = 1;
k3 = 1;
k4 = 1;
k5 = 1;
k6 = 1;
signal = "";
}
}
//Listener_dy类中编写的是等于号键的响应逻辑
class Listener_dy implements ActionListener {
public void actionPerformed(ActionEvent e) {
store = (JButton)e.getSource();
vt.add(store);
cal();
k1 = 1;
k2 = 1;
k3 = 1;
k4 = 1;
str1 = result;
}
}
//Listener_xiaos类中编写的是小数点键的相应逻辑
class Listener_xiaos implements ActionListener {
public void actionPerformed(ActionEvent e) {
store = (JButton)e.getSource();
vt.add(store);
if(k5 == 1){
String ss2 = ((JButton)e.getSource()).getText();
if(k1 == 1){
if(k3 == 1){
str1 = "";
k5 = 1;
}
str1 = str1 + ss2;
k3 = k3 + 1;
result_TextField.setText(str1);
} else if(k1 == 2){
if(k4 == 1){
str2 = "";
k5 = 1;
}
str2 = str2 + ss2;
k4 = k4 + 1;
result_TextField.setText(str2);
}
}
k5 = k5 + 1;
}
}
// calc()方法中编写了计算逻辑的实现。
public void cal() {
double a2, b2;
String c = signal;
double result2 = 0;
if(c.equals("")){
result_TextField.setText("please input operator");
} else {
if(str1.equals(".")){
str1 = "0.0";
}
if(str2.equals(".")){
str2 = "0.0";
}
a2 = Double.valueOf(str1).doubleValue();
b2 = Double.valueOf(str2).doubleValue();
if(c.equals("+")){
result2 = a2 + b2;
}
if(c.equals("-")){
result2 = a2 - b2;
}
if(c.equals("*")){
BigDecimal m1 = new BigDecimal(Double.toString(a2));
BigDecimal m2 = new BigDecimal(Double.toString(b2));
result2 = m1.multiply(m2).doubleValue();
}
if(c.equals("/")){
if(b2 == 0){
result2 = 0;
} else {
result2 = a2 / b2;
}
}
result = String.valueOf(result2);
result_TextField.setText(result);
}
}
public static void main(String[] args) {
new test8();
}
}
--实现Serializable接口对象在反序列化时不需要调用对象所在类的构造方法,完全基于字节。
--实现externalSerializable接口的方法在反序列化时会调用构造方法。
初学Java时,在学习基础语法的同时,可以将目光投向以下几个方向,这些是工作中常用的知识点: 1.常用框架:Spring、Spring MVC、MyBatis等 2.数据库:MySQL、Oracle等 3.大数据相关:Hadoop、Spark等 4.前端开发:HTML、CSS、JavaScript等 5.网络相关:TCP/IP协议、HTTP协议等 6.操作系统:Linux、Windows等 7.设计模式等高级编程思想,例如单例模式、工厂模式等
在初学时,可以按照自己的需求和兴趣选择重点学习的内容。建议通过实际的项目实战来加深对知识点的理解和掌握。在实际工作中,随着业务的不同,也需要不断学习和掌握新的知识和技能。