JAVA计算器代码

package com.test;

import java.awt.Color;
import java.awt.Font;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

/**
 * 计算器
 * @author Administrator
 * 代码流程:
 * 1.初始化窗口属性
 * 2.添加显示框
 * 3.添加按钮
 * 4.自定义数字按钮事件监听器
 * 5.自定义运算符按钮事件监听器
 * 6.自定义等号按钮事件监听器
 */
public class CalcFrame extends JFrame{
	private static final long serialVersionUID = 1L;
	private JTextField showView = null;
	private NumberBtnActionListener numberBtnActionListener;
	private LogicBtnActionListener logicBtnActionListener;
	private String logic;//记录运算符的字符串
	private String content1 = "";//记录第一个数字的字符串
	private String content2 = "";//记录第二个数字的字符串
	
	
	/**
	 * 一些窗口的初始化操作,放入构造器中(封装思想)
	 */
	public CalcFrame() {
		//窗口标题
		//思考: 调用方法时没有对象来调用  怎么回事??
		setTitle("java计算器");
		//窗口位置和大小
		//需要注意的是  这个坐标是相对于桌面  在桌面的哪个位置出现
		setBounds(300,150,220, 320);
		//设置窗口右上角 关闭按钮的事件
		//点击时关闭
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		//不能改变大小
		setResizable(false);
		
		//设置窗口布局为null  不设置窗口布局
		setLayout(null);
		/**
		 * 重点: 调用方法,往窗口中添加显示框
		 */
		addView();
		
		/**
		 * 重点:调用方法,往窗口中添加按钮
		 */
		addButton();
		
		//对象创建完成时,显示窗口
		setVisible(true);
	}
	/**
	 * 窗口中添加按钮的方法
	 */
	private void addButton() {
		numberBtnActionListener = new NumberBtnActionListener();
		logicBtnActionListener = new LogicBtnActionListener();
		JButton button_7 = new JButton("7");
		button_7.setBounds(5,65,40,40);
		//设置按钮边框为 浅灰色 厚度为1
		button_7.setBorder(new LineBorder(Color.lightGray,1));
		button_7.addActionListener(numberBtnActionListener);
		add(button_7);
		
		JButton button_8 = new JButton("8");
		button_8.setBounds(60,65,40,40);
		button_8.setBorder(new LineBorder(Color.lightGray,1));
		button_8.addActionListener(numberBtnActionListener);
		add(button_8);
		
		JButton button_9 = new JButton("9");
		button_9.setBounds(115,65,40,40);
		button_9.setBorder(new LineBorder(Color.lightGray,1));
		button_9.addActionListener(numberBtnActionListener);
		add(button_9);
		
		JButton button_add = new JButton("+");
		button_add.setBounds(170,65,40,40);
		button_add.setBorder(new LineBorder(Color.lightGray,1));
		button_add.addActionListener(logicBtnActionListener);
		add(button_add);
		
		JButton button_4 = new JButton("4");
		button_4.setBounds(5,120,40,40);
		//设置按钮边框为 浅灰色 厚度为1
		button_4.setBorder(new LineBorder(Color.lightGray,1));
		button_4.addActionListener(numberBtnActionListener);
		add(button_4);
		
		JButton button_5 = new JButton("5");
		button_5.setBounds(60,120,40,40);
		button_5.setBorder(new LineBorder(Color.lightGray,1));
		button_5.addActionListener(numberBtnActionListener);
		add(button_5);
		
		JButton button_6 = new JButton("6");
		button_6.setBounds(115,120,40,40);
		button_6.setBorder(new LineBorder(Color.lightGray,1));
		button_6.addActionListener(numberBtnActionListener);
		add(button_6);
		
		JButton button_sub = new JButton("-");
		button_sub.setBounds(170,120,40,40);
		button_sub.setBorder(new LineBorder(Color.lightGray,1));
		button_sub.addActionListener(logicBtnActionListener);
		add(button_sub);
		
		
		JButton button_1 = new JButton("1");
		button_1.setBounds(5,175,40,40);
		//设置按钮边框为 浅灰色 厚度为1
		button_1.setBorder(new LineBorder(Color.lightGray,1));
		button_1.addActionListener(numberBtnActionListener);
		add(button_1);
		
		JButton button_2 = new JButton("2");
		button_2.setBounds(60,175,40,40);
		button_2.setBorder(new LineBorder(Color.lightGray,1));
		button_2.addActionListener(numberBtnActionListener);
		add(button_2);
		
		JButton button_3 = new JButton("3");
		button_3.setBounds(115,175,40,40);
		button_3.setBorder(new LineBorder(Color.lightGray,1));
		button_3.addActionListener(numberBtnActionListener);
		add(button_3);
		
		JButton button_mul = new JButton("*");
		button_mul.setBounds(170,175,40,40);
		button_mul.setBorder(new LineBorder(Color.lightGray,1));
		button_mul.addActionListener(logicBtnActionListener);
		add(button_mul);
		
		
		JButton button_0 = new JButton("0");
		button_0.setBounds(5,230,40,40);
		//设置按钮边框为 浅灰色 厚度为1
		button_0.setBorder(new LineBorder(Color.lightGray,1));
		button_0.addActionListener(numberBtnActionListener);
		add(button_0);
		
		JButton button_eq = new JButton("=");
		button_eq.setBounds(60,230,40,40);
		button_eq.setBorder(new LineBorder(Color.lightGray,1));
		button_eq.addActionListener(new EqBtnActionListener());
		add(button_eq);
		
		JButton button_c = new JButton("c");
		button_c.setBounds(115,230,40,40);
		button_c.setBorder(new LineBorder(Color.lightGray,1));
		button_c.addActionListener(new CleanBtnActionListener());
		add(button_c);
		
		JButton button_div = new JButton("/");
		button_div.setBounds(170,230,40,40);
		button_div.setBorder(new LineBorder(Color.lightGray,1));
		button_div.addActionListener(logicBtnActionListener);
		add(button_div);
		
		
	}
	/**
	 * 往窗口添加显示框的方法  
	 */
	private void addView() {
		//先添加显示框  只读编辑框  默认显示0  所以直接在构造器中 传入0  注意 传入的是字符串才能显示
		//这里使用成员变量的原因是:在按钮的事件监听器中需要使用显示框变量,所有使用成员变量来保存这个显示框,其他方法才能访问
		showView = new JTextField("0");
		//需要注意,这里的坐标是相对于窗口内部,而不再是桌面。
		showView.setBounds(5, 5, 205, 55);
		showView.setHorizontalAlignment(JTextField.RIGHT);
		//设置是否可编辑  设置只读
		showView.setEditable(false);
		//设置背景色
		showView.setBackground(new Color(192, 192, 192));
		//设置字体 粗细 大小
		showView.setFont(new Font("Cambria", Font.BOLD, 16));
		add(showView);
	}
	public static void main(String[] args) {
		new CalcFrame();
	}
	/**
	 * 使用内部类实现事件监听器接口
	 * 数字按钮监听器
	 * 此监听器需要做的事
	 * 1.获取按钮内容
	 * 2.拼接字符串
	 * 3.保存到第一个数字字符串成员变量
	 * 3.转换为数字
	 * 4.设置到显示框
	 * 添加了运算符按钮之后增加的操作
	 * 6.判断运算符有没有被点击
	 * 7.如果点击了 将拼接的字符串保存到第二个数字字符串变量中
	 */
	class NumberBtnActionListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			
			//2.获取按钮内容
			JButton btn = (JButton)e.getSource();
			String btn_text = btn.getText();
			if (logic!=null&&!"".equals(logic)) {
				//3.拼接字符串
				content2=content2+btn_text;
				//4.转换为数字
				int number = Integer.valueOf(content2);
				//5.设置到显示框
				showView.setText(number+"");
			}else {
				//3.拼接字符串
				content1=content1+btn_text;
				//4.转换为数字
				int number = Integer.valueOf(content1);
				//5.设置到显示框
				showView.setText(number+"");
			}
		}
		
	}
	/**
	 * 清空按钮事件监听器
	 * 1.设置显示框内容为空
	 * 2.清空数字字符串
	 * 3.清空运算符字符串
	 */
	class CleanBtnActionListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			//1.设置显示框内容为空
			showView.setText("0");
			//2.清空操作
			content1 = "";
			content2 = "";
			logic = "";
		}
		
	}
	
	/**
	 * 运算符按钮事件监听器
	 * 
	 * 点击运算符按钮是判断计算器前后两个数字的临界点(临界操作)
	 * 也就是说,点击运算符按钮后,需要将运算符保存,供数字按钮监听器中判断
	 * 1.获取运算符符号
	 * 2.保存到成员变量中(为什么要保存到成员变量中)
	 */
	class LogicBtnActionListener implements ActionListener{

		public void actionPerformed(ActionEvent e) {
			//1.获取运算符内容
			JButton btn = (JButton)e.getSource();
			String logic = btn.getText();
			//2.保存到成员变量中  因为成员变量与这个局部变量名字相同,且this代表的是当前监听器对象,所有使用CalcFrame中this
			CalcFrame.this.logic = logic;
		}
		
	}
	/**
	 * 等号按钮事件监听器
	 * 1.将数字字符串1转换为数字
	 * 2.将数字字符串2转换为数字
	 * 3.对运算符进行判断和运算
	 * 4.显示框显示内容
	 * 5.清空两个数字字符串和运算符
	 * @author Administrator
	 *
	 */
	class EqBtnActionListener implements ActionListener{
		public void actionPerformed(ActionEvent e) {
			if (content1!=null&&!"".equals(content1)&&content2!=null&&!"".equals(content2)&&logic!=null&&!"".equals(logic)) {
				//1.将数字字符串1转换为数字
				Integer number1 = Integer.valueOf(content1);
				//2.将数字字符串2转换为数字
				Integer number2 = Integer.valueOf(content2);
				//3.判断运算符
				String content = "";
				switch (logic) {
				case "+":
					content = (number1+number2)+"";
					break;
				case "-":
					content = (number1-number2)+"";
					break;
				case "*":
					content = (number1*number2)+"";
					break;
				case "/":
					content = (new Double(number1)/new Double(number2))+"";
					break;
				default:
					break;
				}
				//4.显示框显示最终结果
				showView.setText(content);
				//5.清空操作
				content1 = "";
				content2 = "";
				logic = "";
			}
		}
		
	}
}

 有粉丝找我加了几个功能  退格/小数点/取模 代码如下

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;
import java.util.Date;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
import javax.swing.border.LineBorder;

public class CalcFrame extends JFrame {
    public static int screen_width;
    public static int screen_height;

    static {
        Dimension size = Toolkit.getDefaultToolkit().getScreenSize();
        screen_width = size.width;
        screen_height = size.height;
    }

    /**
     * 计算器
     * 代码流程:
     * 1.初始化窗口属性
     * 2.添加显示框
     * 3.添加按钮
     * 4.自定义数字按钮事件监听器
     * 5.自定义运算符按钮事件监听器
     * 6.自定义等号按钮事件监听器
     */
    private static final long serialVersionUID = 1L;
    private JTextField showView = null;
    private NumberBtnActionListener numberBtnActionListener;
    private LogicBtnActionListener logicBtnActionListener;
    private String logic;//记录运算符的字符串
    private String content1 = "";//记录第一个数字的字符串
    private String content2 = "";//记录第二个数字的字符串
    private String resultContent = "";//此字符串用来做显示
    private int width = 220;//计算器宽度
    private int height = 360;//计算器高度
    private boolean isResult = false;//当前是否是出结果的时候
    public static void main(String[] args) {
        new CalcFrame();
    }
    /**
     * 一些窗口的初始化操作,放入构造器中(封装思想)
     */
    public CalcFrame() {
        //窗口标题
        //思考: 调用方法时没有对象来调用  怎么回事??
        setTitle("java计算器");
        //窗口位置和大小
        //需要注意的是  这个坐标是相对于桌面  在桌面的哪个位置出现 目前计算是居中显示
        setBounds((screen_width - width)/2, (screen_height - height)/2, width, height);
        //设置窗口右上角 关闭按钮的事件
        //点击时关闭
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //不能改变大小
        setResizable(false);
        //设置窗口布局为null  不设置窗口布局
        setLayout(null);
        /**
         * 重点: 调用方法,往窗口中添加显示框
         */
        addView();

        /**
         * 重点:调用方法,往窗口中添加按钮
         */
        addButton();
        //对象创建完成时,显示窗口
        setVisible(true);
    }

    /**
     * 窗口中添加按钮的方法
     */
    private void addButton() {
        numberBtnActionListener = new NumberBtnActionListener();
        logicBtnActionListener = new LogicBtnActionListener();

        JButton button_7 = new JButton("7");
        button_7.setBounds(5, 65, 40, 40);
        //设置按钮边框为 浅灰色 厚度为1
        button_7.setBorder(new LineBorder(Color.lightGray, 1));
        button_7.addActionListener(numberBtnActionListener);
        add(button_7);

        JButton button_8 = new JButton("8");
        button_8.setBounds(60, 65, 40, 40);
        button_8.setBorder(new LineBorder(Color.lightGray, 1));
        button_8.addActionListener(numberBtnActionListener);
        add(button_8);

        JButton button_9 = new JButton("9");
        button_9.setBounds(115, 65, 40, 40);
        button_9.setBorder(new LineBorder(Color.lightGray, 1));
        button_9.addActionListener(numberBtnActionListener);
        add(button_9);

        JButton button_4 = new JButton("4");
        button_4.setBounds(5, 115, 40, 40);
        //设置按钮边框为 浅灰色 厚度为1
        button_4.setBorder(new LineBorder(Color.lightGray, 1));
        button_4.addActionListener(numberBtnActionListener);
        add(button_4);

        JButton button_5 = new JButton("5");
        button_5.setBounds(60, 115, 40, 40);
        button_5.setBorder(new LineBorder(Color.lightGray, 1));
        button_5.addActionListener(numberBtnActionListener);
        add(button_5);

        JButton button_6 = new JButton("6");
        button_6.setBounds(115, 115, 40, 40);
        button_6.setBorder(new LineBorder(Color.lightGray, 1));
        button_6.addActionListener(numberBtnActionListener);
        add(button_6);

        JButton button_1 = new JButton("1");
        button_1.setBounds(5, 165, 40, 40);
        //设置按钮边框为 浅灰色 厚度为1
        button_1.setBorder(new LineBorder(Color.lightGray, 1));
        button_1.addActionListener(numberBtnActionListener);
        add(button_1);

        JButton button_2 = new JButton("2");
        button_2.setBounds(60, 165, 40, 40);
        button_2.setBorder(new LineBorder(Color.lightGray, 1));
        button_2.addActionListener(numberBtnActionListener);
        add(button_2);

        JButton button_3 = new JButton("3");
        button_3.setBounds(115, 165, 40, 40);
        button_3.setBorder(new LineBorder(Color.lightGray, 1));
        button_3.addActionListener(numberBtnActionListener);
        add(button_3);

        JButton button_0 = new JButton("0");
        button_0.setBounds(5, 215, 40, 40);
        //设置按钮边框为 浅灰色 厚度为1
        button_0.setBorder(new LineBorder(Color.lightGray, 1));
        button_0.addActionListener(numberBtnActionListener);
        add(button_0);

        JButton button_eq = new JButton("=");
        button_eq.setBounds(115, 215, 40, 90);
        button_eq.setBorder(new LineBorder(Color.lightGray, 1));
        button_eq.addActionListener(new EqBtnActionListener());
        add(button_eq);

        JButton button_point = new JButton(".");
        button_point.setBounds(60, 215, 40, 40);
        button_point.setBorder(new LineBorder(Color.lightGray, 1));
        button_point.addActionListener(e -> {
            //如果上一个操作是刚出结果  那么直接点数字,则将数字进行替换 因为这个时候 content1中存着结果
            if(isResult&&!isNotNullAndEmpty(logic)){
                isResult = false;
                content1 = "";
            }
            //当前是否存在运算符
            if(!isNotNullAndEmpty(logic)){
                //不存在
                if(content1==null||content1.length()==0){
                    content1 = "0.";
                }else{
                    content1 += content1.indexOf(".")==-1?".":"";
                }
            }else{
                //存在
                if(content1==null||content2.length()==0){
                    content2 = "0.";
                }else{
                    content2 += content2.indexOf(".")==-1?".":"";
                }
            }
            resultContent = (isNotNullAndEmpty(content1)?content1:"") + (isNotNullAndEmpty(logic)?logic:"") + (isNotNullAndEmpty(content2)?content2:"");
            showView.setText(resultContent);
        });
        add(button_point);
        //--------------------------------------------------------------------------
        JButton button_add = new JButton("+");
        button_add.setBounds(170, 65, 40, 40);
        button_add.setBorder(new LineBorder(Color.lightGray, 1));
        button_add.addActionListener(logicBtnActionListener);
        add(button_add);
        JButton button_sub = new JButton("-");
        button_sub.setBounds(170, 115, 40, 40);
        button_sub.setBorder(new LineBorder(Color.lightGray, 1));
        button_sub.addActionListener(logicBtnActionListener);
        add(button_sub);
        JButton button_mul = new JButton("*");
        button_mul.setBounds(170, 165, 40, 40);
        button_mul.setBorder(new LineBorder(Color.lightGray, 1));
        button_mul.addActionListener(logicBtnActionListener);
        add(button_mul);
        JButton button_div = new JButton("/");
        button_div.setBounds(170, 215, 40, 40);
        button_div.setBorder(new LineBorder(Color.lightGray, 1));
        button_div.addActionListener(logicBtnActionListener);
        add(button_div);
        JButton button_mod = new JButton("%");
        button_mod.setBounds(170, 265, 40, 40);
        button_mod.setBorder(new LineBorder(Color.lightGray, 1));
        button_mod.addActionListener(logicBtnActionListener);
        add(button_mod);
        //--------------------------------------------------------------------------

        JButton button_c = new JButton("c");
        button_c.setBounds(5, 265, 40, 40);
        button_c.setBorder(new LineBorder(Color.lightGray, 1));
        button_c.addActionListener(new CleanBtnActionListener());
        add(button_c);
        JButton button_clean = new JButton("⬅");
        button_clean.setBounds(60, 265, 40, 40);
        button_clean.setBorder(new LineBorder(Color.lightGray, 1));
        button_clean.addActionListener(e -> {
            //当前是否存在运算符
            if(!isNotNullAndEmpty(logic)){
                //不存在
                if(content1==null||content1.length()==0){
                    return;
                }else{
                    content1 = content1.substring(0,content1.length()-1);
                }
            }else{
                //存在
                if(content1==null||content2.length()==0){
                    //删运算符
                    logic = "";
                }else{
                    content2 = content2.substring(0,content2.length()-1);
                }
            }
            resultContent = (isNotNullAndEmpty(content1)?content1:"") + (isNotNullAndEmpty(logic)?logic:"") + (isNotNullAndEmpty(content2)?content2:"");
            showView.setText(resultContent);
        });
        add(button_clean);
        //--------------------------------------------------------------------------
    }

    /**
     * 往窗口添加显示框的方法
     */
    private void addView() {
        //先添加显示框  只读编辑框  默认显示0  所以直接在构造器中 传入0  注意 传入的是字符串才能显示
        //这里使用成员变量的原因是:在按钮的事件监听器中需要使用显示框变量,所有使用成员变量来保存这个显示框,其他方法才能访问
        showView = new JTextField(resultContent);
        //需要注意,这里的坐标是相对于窗口内部,而不再是桌面。
        showView.setBounds(5, 5, 205, 55);
        showView.setHorizontalAlignment(JTextField.RIGHT);
        //设置是否可编辑  设置只读
        showView.setEditable(false);
        //设置背景色
        showView.setBackground(new Color(192, 192, 192));
        //设置字体 粗细 大小
        showView.setFont(new Font("Cambria", Font.BOLD, 16));
        add(showView);
    }
    /**
     * 使用内部类实现事件监听器接口
     * 数字按钮监听器
     * 此监听器需要做的事
     * 1.获取按钮内容
     * 2.拼接字符串
     * 3.保存到第一个数字字符串成员变量
     *
     * 添加了运算符按钮之后增加的操作
     * 4.判断运算符有没有被点击
     * 5.如果点击了 将拼接的字符串保存到第二个数字字符串变量中
     *
     * 4.设置到显示框
     */
    class NumberBtnActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //如果上一个操作是刚出结果  那么直接点数字,则将数字进行替换 因为这个时候 content1中存着结果
            if(isResult&&!isNotNullAndEmpty(logic)){
                isResult = false;
                content1 = "";
            }
            //1.获取按钮内容
            JButton btn = (JButton) e.getSource();
            String btn_text = btn.getText();
            if (isNotNullAndEmpty(logic)) {
                //2.拼接字符串 这里先转一次BigDecimal是担心用户输入0开头,如:022,开起来会比较别扭 所以转数字后 会将前面的0取消
                content2 = new BigDecimal(content2 + btn_text).toString();
            } else {
                //2.拼接字符串
                content1 = new BigDecimal(content1 + btn_text).toString();
            }
            //3.设置到显示框
            resultContent = (isNotNullAndEmpty(content1)?content1:"") + (isNotNullAndEmpty(logic)?logic:"") + (isNotNullAndEmpty(content2)?content2:"");
            showView.setText(resultContent);
        }
    }

    /**
     * 清空按钮事件监听器
     * 1.设置显示框内容为空
     * 2.清空数字字符串
     * 3.清空运算符字符串
     */
    class CleanBtnActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //1.清空操作
            resultContent = "";
            content1 = "";
            content2 = "";
            logic = "";
            //2.设置显示框内容为空
            showView.setText(resultContent);
        }

    }

    class LogicBtnActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            //点击运算符的时候 先去计算一次结果 如果有计算条件
            new EqBtnActionListener().actionPerformed(null);
            //1.获取运算符内容
            JButton btn = (JButton) e.getSource();
            String logicStr = btn.getText();
            //2.保存到成员变量中  因为成员变量与这个局部变量名字相同,且this代表的是当前监听器对象,所有使用CalcFrame中this
            logic = logicStr;
            //3.显示
            resultContent = content1 + logic;
            showView.setText(resultContent);
        }

    }

    class EqBtnActionListener implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            if ( isNotNullAndEmpty(content1) && isNotNullAndEmpty(content2) && isNotNullAndEmpty(logic)) {
                //1.将数字字符串1转换为数字
                Double number1 = new Double(content1);
                //2.将数字字符串2转换为数字
                Double number2 = new Double(content2);
                //3.判断运算符
                switch (logic) {
                    case "+":
                        resultContent = (number1 + number2) + "";
                        break;
                    case "-":
                        resultContent = (number1 - number2) + "";
                        break;
                    case "*":
                        resultContent = (number1 * number2) + "";
                        break;
                    case "/":
                        resultContent = (new Double(number1) / new Double(number2)) + "";
                        break;
                    case "%":
                        resultContent = (new Double(number1) % new Double(number2)) + "";
                        break;
                    default:
                        break;
                }
                //4.显示框显示最终结果
                showView.setText(resultContent);
                //5.清空操作
                content2 = "";
                logic = "";
                //6.将结果赋值给content1
                content1 = resultContent;
                isResult = true;
            }
        }
    }

    /**
     * 判断字符串非空的工具方法
     */
    public boolean isNotNullAndEmpty(String str){
        return str!=null&&!"".equals(str.trim());
    }
}

  • 46
    点赞
  • 273
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 19
    评论
评论 19
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

微笑い一刀

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值