【Java基础】第五章 界面展示响应事件/普通界面建立/手把手从零用java写一个计算器

界面


之前有写过关于界面操作的一篇博文,但是觉得有一些描述比较的啰嗦,因此现在重新写一篇
不过如果想要实现上一篇的那个效果的话,还是可以参考那个代码的,因此做了一些保留

基本建立界面

步骤

1)写一个界面
2)定义组件和布局
3)加到界面上
4)显示

代码

import javax.swing.*;
import java.awt.*;

public class LoginUI extends JFrame {

    // 初始化方法
    public void initUI(){
        this.setSize(400,200);
        this.setTitle("仿QQ登录界面");
        this.setVisible(true);

        FlowLayout fl = new FlowLayout();
        this.setLayout(fl);

        JTextField jtf = new JTextField(15);
        JButton bu = new JButton("登录");

        this.add(jtf);
        this.add(bu);
        this.setVisible(true);
    }

    // 主函数
    public static void main(String[] args){
        LoginUI db = new LoginUI();
        db.initUI();
    }
}

效果:
在这里插入图片描述
很简单吧,开始加东西,我们四处看看,看上了一个简单的计算器,试着自己写一个

写一个计算器

步骤

需要考虑几个问题:

布局

我们总先要把框架搭建起来吧,这里我们选择用菜单的形式来构建~搭建开始
先搭建好菜单部分,步骤:(因为直接继承了JFrame,因此可以直接开始写)
1)写好组件

		// 搭建界面
        setBounds(100,100,400,400);
        setTitle("计算器");
        // 写组件
        JMenuBar menubar=new JMenuBar();
        JMenu menu1=new JMenu("查看(V)");
        JMenu menu2=new JMenu("编辑(E)");
        JMenu menu3=new JMenu("帮助(H)");
        menubar.add(menu1);
        menubar.add(menu2);
        menubar.add(menu3);
        // 写到界面上,加好布局
        this.setJMenuBar(menubar);//将设置好的菜单条放在窗口中
        this.setLayout(new BorderLayout());
        this.setVisible(true);

执行看看效果
在这里插入图片描述
接着把两个部分写进去,显示的区域和计算器的按钮区域。
//注意,在写这个类的时候,我们开始就定义了JTextArea(),这样之后才能正常的显示。

// 加分区:计算显示的区域以及摆放按钮的部分,放在两个面板上
        JPanel p1=new JPanel();
        JPanel p2=new JPanel();
        text.setPreferredSize(new Dimension (370,60));//设置组件大小
        p1.add(text);
        this.add(p1,BorderLayout.NORTH);

在这里插入图片描述
定义按钮组件和布局,放进去

  // 定义主体组件放到第二个面板上,并且设置面板布局,在面板上用格子和流式两个布局
        // 把组件放到一个数组里面,等下就可以写循环语句来加入组件了
        p2.setLayout(new FlowLayout());
        p2.setLayout(new GridLayout(5,4));	//添加按钮
        JButton button[]=new JButton[20];
        button[0]=new JButton("C");
        button[1]=new JButton("CE");
        button[2]=new JButton("%");
        button[3]=new JButton("÷");
        button[4]=new JButton("7");
        button[5]=new JButton("8");
        button[6]=new JButton("9");
        button[7]=new JButton("x");
        button[8]=new JButton("4");
        button[9]=new JButton("5");
        button[10]=new JButton("6");
        button[11]=new JButton("—");
        button[12]=new JButton("1");
        button[13]=new JButton("2");
        button[14]=new JButton("3");
        button[15]=new JButton("+");
        button[16]=new JButton("e");
        button[17]=new JButton("0");
        button[18]=new JButton(".");
        button[19]=new JButton("=");

         // 循环语句来加入组件
        for(int i=0;i<button.length;i++ )
            p2.add(button[i]);
        // 在等号上加些色彩再加进去,当然你啥也不加完全也可以
        button[19].setBackground(Color.YELLOW);
        p2.add(button[19]);
        add(p2,BorderLayout.CENTER);

让我们运行来看看
在这里插入图片描述
看看框架不就搭好了吗嘿嘿,往下写方法咯~

方法实现

这里的方法都是建立在点击上的,因此我们只需要action listener就可以了,我们选择将对象同时继承Jframe和实现actionlistener接口,编写init方法,并且在main程序里面调用完成计算器的显示。

具体方法的实现需要我们利用监听器,因此先在每一个按钮上加上监听器

// 加入监听器
        for(int i=0;i<button.length;i++){
            button[i].addActionListener(this); 
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击X号可以关闭程序
    }

接着开始根据监听器的方法
这里我们实现一个简单的计算器,即我们默认输入的两个数字进行一次计算
1)当是数字的时候,直接存储起来
2)当是符号的时候,设置一下符号提示符,用这个数字表示是不同的符号,并且把前面的数字存起来
3)当点击等号的时候,先看看是什么符号,根据符号进行计算
4)每一步除了里面的处理,还要注意显示的问题,使用的方法是setText

这个地方我们利用存储的类是:StringBuilder
可以把数字用字符串的形式存储起来

第一种,直接显示类
其中每一个都是一样的书写逻辑
(这个代码看起来就很不爽,真码农了害)

// 数字直接显示类
        if(note.equals("0"))
        {
            stringBuilder.append("0");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("1"))
        {
            stringBuilder.append("1");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("2"))
        {
            stringBuilder.append("2");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("3"))
        {
            stringBuilder.append("3");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("4"))
        {
            stringBuilder.append("4");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("5"))
        {
            stringBuilder.append("5");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("6"))
        {
            stringBuilder.append("6");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("7"))
        {
            stringBuilder.append("7");
            text.setText(stringBuilder.toString());
        }

        else if(note.equals("8"))
        {
            stringBuilder.append("8");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("9"))
        {
            stringBuilder.append("9");
            text.setText(stringBuilder.toString());
        }

        else if(note.equals("CE"))
        {
            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("C"))
        {
            stringBuilder = new StringBuilder();
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("."))
        {
            stringBuilder.append(".");
            text.setText(stringBuilder.toString());
        }

第二种:加减乘除求余,我们需要设置符号了
这里我们直接先给类一个私有变量好了,叫做xmark
点击符号之后,我们还需要把之前的变量存起来,用一个叫做remain的变量

 else if(note.equals("+"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark = 0;
            stringBuilder = new StringBuilder();
            text.setText("+");
        }
        else if(note.equals("—"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark = 1;
            stringBuilder = new StringBuilder();
            text.setText("—");
        }
        else if(note.equals("x"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark=2;
            stringBuilder = new StringBuilder();
            text.setText("x");
        }
        else if(note.equals("÷"))
        {
            xmark=3;
            remain = Double.parseDouble(stringBuilder.toString());
            stringBuilder = new StringBuilder();
            text.setText("÷");
        }

        else if(note.equals("%"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark=4;
            stringBuilder = new StringBuilder();
            text.setText("%");
        }
        else if(note.equals("e"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark=5;
            stringBuilder = new StringBuilder();
            text.setText("e");
        }

最后,就来处理等号的时候的情况了

 else if(note.equals("="))
        {
            // 我们用remain存储先的数字,现在可以获得第二个数字了
            newin = Double.parseDouble(stringBuilder.toString());
            // 加法
            if (xmark == 0)
            {
                sum= remain+newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 减法
            else if (xmark == 1)
            {
                sum = remain - newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 乘法
            else if (xmark == 2)
            {
                sum = remain * newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 除法
            else if (xmark == 3)
            {
                sum = remain / newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 求余
            else if (xmark == 4)
            {
                sum = remain % newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            //次幂: remain的 newin 次幂
            else if (xmark == 5)
            {
                if(newin==0)
                    sum=1.0;
                else
                    sum = Math.pow(remain,newin);
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            else
                text.setText(stringBuilder.toString());
    }

最后就是我们搭建好的计算器了~
然后写一下主函数建立这个类,并且调用我们写的方法就ok啦~

代码

完整代码

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class Caculator extends JFrame implements ActionListener {
    JTextArea text=new JTextArea();
    private StringBuilder stringBuilder = new StringBuilder();
    Integer xmark;
    Double remain;
    Double newin;
    Double sum;

    public void initCaculator(){
        // 搭建界面
        setBounds(100,100,400,400);
        setTitle("计算器");
        JMenuBar menubar=new JMenuBar();//创建菜单条
        JMenu menu1=new JMenu("查看(V)");//创建和设置菜单名
        JMenu menu2=new JMenu("编辑(E)");//创建和设置菜单名
        JMenu menu3=new JMenu("帮助(H)");//创建和设置菜单名
        menubar.add(menu1);//将菜单加入到菜单条中
        menubar.add(menu2);
        menubar.add(menu3);
        this.setJMenuBar(menubar);//将设置好的菜单条放在窗口中
        this.setLayout(new BorderLayout());


        // 加分区:计算显示的区域以及摆放按钮的部分,放在两个面板上
        JPanel p1=new JPanel();
        JPanel p2=new JPanel();
        text.setPreferredSize(new Dimension (370,60));//设置组件大小
        p1.add(text);
        this.add(p1,BorderLayout.NORTH);

        // 定义主体组件放到第二个面板上,并且设置面板布局,在面板上用格子和流式两个布局
        // 把组件放到一个数组里面,等下就可以写循环语句来加入组件了
        p2.setLayout(new FlowLayout());
        p2.setLayout(new GridLayout(5,4));	//添加按钮
        JButton button[]=new JButton[20];
        button[0]=new JButton("C");
        button[1]=new JButton("CE");
        button[2]=new JButton("%");
        button[3]=new JButton("÷");
        button[4]=new JButton("7");
        button[5]=new JButton("8");
        button[6]=new JButton("9");
        button[7]=new JButton("x");
        button[8]=new JButton("4");
        button[9]=new JButton("5");
        button[10]=new JButton("6");
        button[11]=new JButton("—");
        button[12]=new JButton("1");
        button[13]=new JButton("2");
        button[14]=new JButton("3");
        button[15]=new JButton("+");
        button[16]=new JButton("e");
        button[17]=new JButton("0");
        button[18]=new JButton(".");
        button[19]=new JButton("=");

        // 循环语句来加入组件
        for(int i=0;i<button.length;i++ )
            p2.add(button[i]);
        // 在等号上加些色彩
        button[19].setBackground(Color.YELLOW);
        p2.add(button[19]);
        add(p2,BorderLayout.CENTER);

        // 加入监听器
        for(int i=0;i<button.length;i++){
            button[i].addActionListener(this);
        this.setVisible(true);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); //点击X号可以关闭程序
    }
        this.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        // 获取按钮上面字迹
        String note = e.getActionCommand();

        // 数字直接显示类
        if(note.equals("0"))
        {
            stringBuilder.append("0");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("1"))
        {
            stringBuilder.append("1");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("2"))
        {
            stringBuilder.append("2");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("3"))
        {
            stringBuilder.append("3");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("4"))
        {
            stringBuilder.append("4");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("5"))
        {
            stringBuilder.append("5");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("6"))
        {
            stringBuilder.append("6");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("7"))
        {
            stringBuilder.append("7");
            text.setText(stringBuilder.toString());
        }

        else if(note.equals("8"))
        {
            stringBuilder.append("8");
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("9"))
        {
            stringBuilder.append("9");
            text.setText(stringBuilder.toString());
        }

        else if(note.equals("CE"))
        {
            stringBuilder.deleteCharAt(stringBuilder.length() - 1);
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("C"))
        {
            stringBuilder = new StringBuilder();
            text.setText(stringBuilder.toString());
        }
        else if(note.equals("."))
        {
            stringBuilder.append(".");
            text.setText(stringBuilder.toString());
        }

        // 符号类
        else if(note.equals("+"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark = 0;
            stringBuilder = new StringBuilder();
            text.setText("+");
        }
        else if(note.equals("—"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark = 1;
            stringBuilder = new StringBuilder();
            text.setText("—");
        }
        else if(note.equals("x"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark=2;
            stringBuilder = new StringBuilder();
            text.setText("x");
        }
        else if(note.equals("÷"))
        {
            xmark=3;
            remain = Double.parseDouble(stringBuilder.toString());
            stringBuilder = new StringBuilder();
            text.setText("÷");
        }

        else if(note.equals("%"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark=4;
            stringBuilder = new StringBuilder();
            text.setText("%");
        }
        else if(note.equals("e"))
        {
            remain = Double.parseDouble(stringBuilder.toString());
            xmark=5;
            stringBuilder = new StringBuilder();
            text.setText("e");
        }

        // 计算类
        else if(note.equals("="))
        {
            // 我们用remain存储先的数字,现在可以获得第二个数字了
            newin = Double.parseDouble(stringBuilder.toString());
            // 加法
            if (xmark == 0)
            {
                sum= remain+newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 减法
            else if (xmark == 1)
            {
                sum = remain - newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 乘法
            else if (xmark == 2)
            {
                sum = remain * newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 除法
            else if (xmark == 3)
            {
                sum = remain / newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            // 求余
            else if (xmark == 4)
            {
                sum = remain % newin;
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            //次幂: remain的 newin 次幂
            else if (xmark == 5)
            {
                if(newin==0)
                    sum=1.0;
                else
                    sum = Math.pow(remain,newin);
                text.setText(sum.toString());
                stringBuilder = new StringBuilder();
                stringBuilder.append(sum);
            }
            else
                text.setText(stringBuilder.toString());
    }
    }

    // 写入口
    public static void main(String[] args){
        Caculator cal = new Caculator();
        cal.initCaculator();
    }
}

总结

总的来说,其实逻辑都是一样的,写好实现类,搭建框架,写组件,加组件,设置布局,加进去,显示。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值