3.java高级之GUI编程

1.gui (graphical user interface)

   awt sun公司最早的gui,不美观,不兼容各平台
   swing : awt升级

2.顶层容器(只有一个)(其他的只能放这里)Jframe Jdialog对话框 Jwindow(x)

   //在main方法写
   f=new Jframe();  
   f.setSize(300,300); //设置大小
   f.setTitle("hello");  //设置窗口标题
   f.setLocation(500,200);//设置在屏幕的位置,默认在左上角
   f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);//设置点击关闭按钮,关闭程序,不用设置也可以(默认)
   f.setVisible(true); //可见,但是看不到,要设置大小
    class Jframe extends JFrame{
          JButton b1,b2,b3;
          JPannel p;
          public MyFrame(){//放在构造方法里面
               //上面的代码改 
              
                b1= new JButton("aaa");    
                   // this.add(b1);//窗口添加按钮,不显示,覆盖了  
                  //this.add(b1);//覆盖了   
	p=new Panel(new FlowLayout( FlowLayout.LEFT,10,15));//左对齐,组件内部的对齐方式左 顶部距离
                                                 //可以自己new 出来定义
               p.add(b1);
               p.add(b2); 
              this.add(p);                  
          }
}//main方法new出来

-----完整代码-----

public class testMyFrame {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame();
    }
}

class MyFrame extends JFrame{
    JPanel jPanel;
    JButton jb,jb2;
    MyFrame(){
        setTitle("标题");
        setLocation(200,200);
        setBounds(200,200,300,500);

        jPanel=new JPanel();
        jb=new JButton("按钮1");
        jb2=new JButton("按钮2");
        jPanel.add(jb);
        jPanel.add(jb2);
        jPanel.setSize(300,300);

        add(jPanel);
        //记得最后一步才设置,不然不显示
        setVisible(true);

    }

}

2.JPanel中间容器(不能独立存在,放在其他容器中)

3.布局方式
panel.setLayOut(xxx);
1.FlowLayout 流布局,从左到右 从上到下(默认布局,默认中间.可以设置对齐方式)
2.BorderLayout 边界布局 容器分为 东西南北中

             ------------------
						北
               东       中        西 
                        南
             -------------------                   
 p=new Panel(new BorderLayout(10,15));//东西南北之间的间距      
 //button放的位置,自己可以添加pannel
p.add(btn1, BorderLayoutEAST);//没人放中间; WEST SOUTH NORTH CENTER
     3.GridLayout网格布局 格子多大界面有多大(弹性)
private JButton[] btns;
              p=new Panel(new GridLayout(3,3));//3行3列 只能行等于列,不然只显示1列 
                 btns=new JButton[6];
                for:
                       p.add(btns[i]);              

--------完整代码-----

public class testMyFrame {
    public static void main(String[] args) {
        MyFrame myFrame = new MyFrame();
    }
}

class MyFrame extends JFrame{
    JPanel jPanel;
    JButton jb,jb2,jb3,jb4;
    MyFrame(){
        setTitle("标题");
        setLocation(200,200);
        setBounds(200,200,300,500);

        jPanel=new JPanel(new GridLayout(2,1));
        jPanel.setBackground(Color.RED);
        jPanel.setSize(300, 300);

        jb=new JButton("按钮1");
        jb2=new JButton("按钮2");
        jPanel.add(jb);
        jPanel.add(jb2);



        jPanel.setSize(300,300);

        add(jPanel);
        //记得最后一步才设置,不然不显示
        setVisible(true);

    }

}
     4.卡片布局(用得少)(像扑克牌一样显示)
 JPanel panel;
Frame2(){
    super("第3题习题");
    this.setSize(400,350);
    this.setLocation(300,200);

    panel = new JPanel();
    JButton jb1 = new JButton("按钮1");
    JButton jb2 = new JButton("按钮2");
    JButton jb3 = new JButton("按钮3");
    JButton jb4 = new JButton("按钮4");
    JButton jb5 = new JButton("按钮5");
    CardLayout cardLayout = new CardLayout();


    panel.setLayout(cardLayout);
    panel.add(jb1);
    panel.add(jb2);
    panel.add(jb3);
    panel.add(jb4);
    panel.add(jb5);



   //是在布局后的pannel后的,前面是完整放入的组件中first和last
    cardLayout.last(panel);
    this.add(panel);
     5.BoxLayout盒布局(按照x轴或y轴排放元素)
p=new Panel(new .BoxLayout(p,));//垂直摆放 X相反
        public class houseWork3BoxGui {
    public static void main(String[] args) {
        Frame4 frame = new Frame4();


        frame.setVisible(true);

    }
}
class Frame4 extends JFrame {
    JPanel panel;
    Frame4(){
        super("第3题习题");
        this.setSize(400,350);
        this.setLocation(300,200);

        panel = new JPanel();
        JButton jb1 = new JButton("按钮1");
        JButton jb2 = new JButton("按钮2");
        JButton jb3 = new JButton("按钮3");
        JButton jb4 = new JButton("按钮4");
        JButton jb5 = new JButton("按钮5");
        BoxLayout boxLayout = new BoxLayout(panel,BoxLayout.Y_AXIS);
        panel.setLayout(boxLayout);
        Insets insets = new Insets(0,100,0,0);
        panel.add(jb1);
        panel.add(jb2);
        panel.add(jb3);
        panel.add(jb4);
        panel.add(jb5);






        this.add(panel);


    }

}

在这里插入图片描述

     6.空布局(全部原始宽高置空,直接自己设置位置);   (考试还是使用这个比较方便)             
    //设置空布局
    setLayOut(null);
   //全部组件有个方法setBounds(0,0,200,200);//记得设置为初始位置,不然看不到
  //精确设置xy和大小,         
         #解决文本框不能设置大小的问题
         
            passwordField.setColumns(20);

3.事件(重点)(发生动作)

事件源(发生的场所,地方,按钮)
事件处理 对发生事件进行处理
事件监听器(接口) event Listener
监听事件发生

1.点击事件改颜色例子

  1. 高级监听事件有对应的方法等待实现,包括了按钮列表菜单
    ActionEvent------ActionListenner
  2. 低级事件…
    MouseEvent—MouseListenner
//写个监听类
    class Listenner impls ActionListenner:  //鼠标MouseListenner
        actionPerformed(e)://处理事件函数
                     Object obj=(JButton)e.getSource();//得到事件源(得到这个btn)
                     if(btn==btnRed){//内部类所以可以对比对象,!!!向btn靠拢
                                p.setBackground(Color.red); //pannel
                      }else if(){xxxx}
                        
//组件添加我们的监听器监听器(注册监听器)
 Listsener l=new Listsener();       
 btnRed.addActionListener(l);    
 btnGreen.addActionListener(l);   
使用匿名内部类(推荐)
             btnRed.addActionListener(new ActionListener(){
                          xxx(){

                            }
     });

5.适配器实现了方法(可以少写实现的方法) extends xxAdapter直接覆盖
(但是进行了细化)

   extends MouseMotionAdapter//只有拖动
              this.repaint();//jframe的方法触发 重写的paint方法
              this.p.repaint();//相当于清除
               g.drawLine(prex,prey,x,y);
                //Btn1左 2中 3右

6.其他常用高级组件
//设置图片icon

   Toolkit t = Toolkit.getDefaultToolkit();
        //设置Icon
        Image i = t.getImage("c:\\adbfe8e3432cc45860d2bdbf5f4bd407.gif");// 相对.java的路径 image:\\time.png
        this.setIconImage(i);//设置大容器的左上角图标
        
  //在组件画图片,JFrame覆盖方法
     public void paint(Graphics g){
      d.drawImage(icon.getImage(),50,50,this);//当前对象
    }             
     //在按钮添加图标
     new JButton("aaa",icon);
      //在jpanel不能设置

7.JLabel(不能响应用户操作)(不能时间监听)(可以类extends)

   new JLabel("text",icon,xx); //只是提示功能

8.文本组件(必须setColume不然不显示)

   JTextField//接收单行文本,指定输入字符长度
   JpasswordField//密码框可以设置 可以遮挡的字符
   JTextArea //长文本 多行

-----高级组件------
9.对话框(可以独立存在的顶级容器)

1.模式(只有关闭按钮,对焦我们这个,点不了父窗口)有套路

jd=new JDialog(this,"提示", Dialog.ModalityType.APPLICATION_MODAL);

2.非模式(可以点父窗口)

  jd=new JDialog(this,"提示", Dialog.ModalityType.MODELESS);
  new JDialog(Frame owner,title,Model);//指定父类窗体,标题,是否模式,默认非模式(不用!!!,只能指定Frame父类)
               .setVisible(true);//可见

3.自定义 trim去首尾空格
extends JDialog
//标准对话框(显示消息和获取消息) 确认消息,显示消息bti !!!(推荐使用,无论是是容器就可以用)

  JOptionPane jOptionPane = new JOptionPane();
                jOptionPane.showMessageDialog(jp,"登录成功","提示",JOptionPane.ERROR_MESSAGE);
第一个可以null,消息内容,标题,自带的图标

//输入对话框

JOptionPane.showInputDialog(null,"输入数字");

在这里插入图片描述

//确认框

 .showConfirmDialog(null,"msg","title",JOptionPane.YES_NO_OPTION);//自己可以选择
  int res = jOptionPane.showConfirmDialog(jp, "是否要保存");

//选择对话框

在这里插入图片描述

//
      JOptionPane jOptionPane = new JOptionPane();
      String options[]={"方案1","方案2","方案3"};
                  

//      int res = jOptionPane.showConfirmDialog(jp, "是否要保存");

                    jOptionPane.showOptionDialog(jp, "选择一个方案:",

                            "方案", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null,

                            options, "方案1");

//文件对话框

   JFileChooser fc=    new JFileChooser();
        int val=fc.showOpenDialog(this);//打开对话框
        //如果点击对话框的打开按钮
        String name1 ="";
        String path="";
        if(val==JFileChooser.APPROVE_OPTION){
            //得文件名和路径
            name1=fc.getSelectedFile().getName();
            path= fc.getCurrentDirectory().toString();
        }

        FileReader d=new FileReader(path+"\\"+name1);

        //保存文件对话框
        fc.showSaveDialog(this);

10.带滚动条的面板(文本放不下)

new JScrollPane("文本");

11.颜色对话框

JColorChooser ch=new JColorChooser();
JDialog jDialog = new JDialog();
jDialog=JColorChooser.createDialog(this, "title", true, new JColorChooser(), new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

    }
}, new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent e) {

    }
});
jDialog.setVisible(true);
Color color = ch.getColor();//得到颜色
System.out.println(color);//rgb的值

12.菜单栏(菜单[菜单项])

JMenuBar menuBar=   new JMenuBar();
this.setJMenuBar(menuBar);//放jframe的顶部
// 有监听器,是否分离式菜单
JMenu menu =new JMenu("title",true);
menuBar.add(menu);
JMenuItem item=new  JMenuItem("aaa");
JMenuItem item1=new  JMenuItem("bbb");
menu.add(item);

menu.add(item1);
menu.addSeparator();//组件之间加分割线
 item.addActionListener(new ActionListener() {
     @Override
     public void actionPerformed(ActionEvent e) {
         System.out.println("点击了");
     }
 });

13.工具栏 JToolBar(对比,不是只是放文字)

JToolBar bar=new JToolBar();

JButton btn =new JButton("save", new ImageIcon("c:\\adbfe8e3432cc45860d2bdbf5f4bd407.gif"));//设置标题和icon
btn.setToolTipText("保存");//鼠标放上的提示信息
bar.add(btn);
jp.add(bar);//放容器顶部

14.空布局的完整登录demo(包括了大部分上面提到的组件)

public class nullLayOut {
    public static void main(String[] args) throws FileNotFoundException {
        MyLayout myLayout = new MyLayout();
        myLayout.setVisible(true);
    }
}

class MyLayout extends JFrame {
    JPanel jp,jp2,jp3,jp4;
    JButton jb;
    JDialog jd;
    JLabel name_lable,pwd_lable,alter_lable;
    JTextField name;
    JPasswordField passwordField;

    JDialog jdl;
    MyLayout() throws FileNotFoundException {
        setTitle("登录");
        setBounds(100,200,500,500);
        setLayout(null);
        Toolkit t = Toolkit.getDefaultToolkit();
        //设置Icon
        Image i = t.getImage("c:\\adbfe8e3432cc45860d2bdbf5f4bd407.gif");
        this.setIconImage(i);



        jp=new JPanel();
        jp.setBounds(0,0,500,100);
        
        jd=new JDialog(this,"提示", Dialog.ModalityType.MODELESS);

//        jp.setBackground(Color.BLACK);
        jp2=new JPanel();
        jp2.setBounds(0,100,500,100);
//        jp2.setBackground(Color.RED);
        jp3=new JPanel();
        jp3.setBounds(0,200,500,100);
//        jp3.setBackground(Color.RED);
        jp4=new JPanel();
        jp4.setBounds(0,300,500,100);
//        jp4.setBackground(Color.RED);

        name_lable=new JLabel("用户名:");
        pwd_lable=new JLabel("密码:");
        alter_lable=new JLabel("提示");

        name=new JTextField();
        name.setColumns(20);
        name.setBounds(0,0,500,200);

        passwordField=new JPasswordField();

        name.setBounds(0,0,500,200);
        passwordField.setColumns(20);
        jb=new JButton("登录");
        jb.setIcon(new ImageIcon("c:\\adbfe8e3432cc45860d2bdbf5f4bd407.gif"));

        jb.addMouseListener(new MouseListener() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println("鼠标点");
            }

            @Override
            public void mousePressed(MouseEvent e) {
                System.out.println("鼠标按");
            }

            @Override
            public void mouseReleased(MouseEvent e) {
                System.out.println("鼠标释放");
            }

            @Override
            public void mouseEntered(MouseEvent e) {
                System.out.println("鼠标进入");
            }

            @Override
            public void mouseExited(MouseEvent e) {
                System.out.println("鼠标离开");
            }
        });
        jb.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                JButton jb=(JButton)e.getSource();
                if(jb.getText().equals("登录")){
                    System.out.println("设置背景");
                    jb.setBackground(Color.RED);
                }

                if(passwordField.getText().equals("aaa")&& name.getText().equals("user")){
                    jd.setBounds(0,0,100,100);
                    jd.setVisible(true);
                    JOptionPane jOptionPane = new JOptionPane();

//                    jOptionPane.showMessageDialog(jp,"message","提示",JOptionPane.ERROR_MESSAGE);
                    String options[]={"方案1","方案2","方案3"};
                    jOptionPane.showInputDialog(jp,"输入数字");

//                    int res = jOptionPane.showConfirmDialog(jp, "是否要保存");

                    jOptionPane.showOptionDialog(jp, "选择一个方案:",

                            "方案", JOptionPane.OK_CANCEL_OPTION, JOptionPane.QUESTION_MESSAGE, null,

                            options, "方案1");

//                    System.out.println(res);
                    alter_lable.setText("登录成功");
                    System.out.println("成功");
                }else{
                    alter_lable.setText("登录失败");
                    System.out.println("失败");
                }
            }
        });
        //======文件选择器=======
//        JFileChooser fc=    new JFileChooser();
//        int val=fc.showOpenDialog(this);//打开对话框
//        //如果点击对话框的打开按钮
//        String name1 ="";
//        String path="";
//        if(val==JFileChooser.APPROVE_OPTION){
//            //得文件名和路径
//            name1=fc.getSelectedFile().getName();
//            path= fc.getCurrentDirectory().toString();
//        }
//
//        FileReader d=new FileReader(path+"\\"+name1);

//        //保存文件对话框
//        fc.showSaveDialog(this);
        //======文件选择器=======


        //===========菜单栏================
        JMenuBar menuBar=   new JMenuBar();
        this.setJMenuBar(menuBar);//放jframe的顶部
        // 有监听器,是否分离式菜单
        JMenu menu =new JMenu("title",true);
        menuBar.add(menu);
        JMenuItem item=new  JMenuItem("aaa");
        JMenuItem item1=new  JMenuItem("bbb");
        menu.add(item);

        menu.add(item1);
        menu.addSeparator();//组件之间加分割线
         item.addActionListener(new ActionListener() {
             @Override
             public void actionPerformed(ActionEvent e) {
                 System.out.println("点击了");
             }
         });
        //===========菜单栏================

        //===========工具栏================
        JToolBar bar=new JToolBar();

        JButton btn =new JButton("save", new ImageIcon("c:\\adbfe8e3432cc45860d2bdbf5f4bd407.gif"));//设置标题和icon
        btn.setToolTipText("保存");//鼠标放上的提示信息
        bar.add(btn);
        jp.add(bar);//放容器顶部
        //===========工具栏================



        //======颜色选择器=======
        JColorChooser ch=new JColorChooser();
        JDialog jDialog = new JDialog();
        jDialog=JColorChooser.createDialog(this, "title", true, new JColorChooser(), new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        }, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {

            }
        });
        jDialog.setVisible(true);
        Color color = ch.getColor();//得到颜色
        System.out.println(color);//rgb的值
     //======颜色选择器=======

        jp.add(name_lable);
        jp.add(name);
        jp2.add(pwd_lable);
        jp2.add(passwordField);
        jp3.add(jb);
        jp4.add(alter_lable);








        add(jp);
        add(jp2);
        add(jp3);
        add(jp4);


    }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/26078.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【linux】web基础与HTTP协议

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 web基础与HTTP协议 一、DNS/HTML1.域名的概述2.域名注册3.网页的概念4.HTML概述5.网页基本标签 二、web基础1.web概述2.静态网页3.静态网页特点4.动态网页5.动态网页的特点 三…

redis数据持久化

Redis是基于内存的,如果不想办法将数据保存在硬盘上,一旦Redis重启(退出/故障),内存的数据将会全部丢失。(业务库中缓存的数据 , 存储的一些重要的标签, 状态数据) 我们肯定不想Redis里头的数据由于某些故障全部丢失(导致所有请求都走MySQL)&…

python基础----05-----函数的多返回值、函数的多种参数使用形式、函数作为参数传递、lambda匿名函数

一 函数的多返回值 if __name__ __main__:# 演示使用多个变量,接收多个返回值def test_return ():return 1,hello,Truex,y,z test_return()print(x)print(y)print(z)1helloTrue二 函数的多种参数使用形式 分为以下四种。 2.1 位置参数 位置参数调用函数时根据…

大数据分析案例-基于决策树算法构建世界杯比赛预测模型

🤵‍♂️ 个人主页:艾派森的个人主页 ✍🏻作者简介:Python学习者 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞&#x1f4…

【计算机网络详解】——应用层(学习笔记)

📖 前言:应用层是计算机网络体系结构的最顶层,是设计和建立计算机网络的最终目的,也是计算机网络中发展最快的部分。在本文中,我们以一些经典的网络应用为例来学习有关网络应用的原理、协议和实现方面的知识。 目录 &a…

12.数据结构之AVL树

前言 提到平衡二叉查找树,不得不提二叉查找树。二叉查找树,说简单点,其实就是将我们的数据节点,有序的维护为一个树形结构。这样我们查的时候,那么我们查找某个节点在不在集合中的时间复杂度实际上就是树的高度。如果…

HNU-操作系统OS-实验Lab7

OS_Lab7_Experimental report 湖南大学信息科学与工程学院 计科 210X wolf (学号 202108010XXX) 实验目的 理解操作系统的同步互斥的设计实现;理解底层支撑技术:禁用中断、定时器、等待队列;在ucore中理解信号量(semaphore)机制的具体实现;理解管程机制,在ucore内…

在linux服务器中对R语言中for循环设置多核运行

1 问题 在R中构建了for循环,由于循环过多,运行速度过慢,且不同循环之间是并行关系,拟通过多核运行可以解决此问题。 2 代码设置 2.1 shell脚本中的设置 b.sh export OPENBLAS_NUM_THREADS8Rscript ./..._1.R \2.2 R代码中的设…

python数据可视化-matplotlib学习总结

目录 (一)常见的图形 1、趋势图(直线图):plot() 2、散点图:scatter(): (二)统计图形 1、柱状图:bar( 2、条形图:barh() 3、直方图&#xff…

【ZLM】ZLM源码阅读一

目录 初始化 RTP RTSP RTMP TCPServer的初始化 参考文档 初始化 RTP RTSP RTMP TCPServer的初始化 参考文档 本文参考: (17条消息) 《ZLToolKit源码学习笔记》(20)网络模块之TcpServer_秦时小的博客-CSDN博客 RTP https://blog.csdn.…

探秘 | 如何分辨内网和外网?

目录 💡 什么是外网IP、内网IP? 💡 对于自有路由器上网的用户,可以这样理解外网IP、内网IP 💡 几个大家经常会问的问题 什么是外网IP、内网IP?很多用户都有一个疑惑,如果不使用路由器拨号上网…

Redis实现分布式锁的原理:常见问题解析及解决方案、源码解析Redisson的使用

0、引言:分布式锁的引出 锁常常用于多线程并发的场景下保证数据的一致性,例如防止超卖、一人一单等场景需求 。通过加锁可以解决在单机情况下安全问题,但是在集群模式下就不行了。集群模式,即部署了多个服务器、并配置了负载均衡后…

ChatGPT 使用 拓展资料:2023年6月 吴恩达大咖Deeplearning.ai最新课程

ChatGPT 使用 拓展资料:2023年6月 吴恩达大咖Deeplearning.ai最新课程 Deeplearning.ai刚刚发布几个新的课程https://www.deeplearning.ai/short-courses/?utm_campaign=May%20Short%20Course%20Launch&utm_content=250952287&utm_medium=social&utm_source=link…

汽车出海势头旺,汽车零部件企业如何破浪前行?

随着国内汽车市场逐渐饱和,中国汽车企业开始寻求“汽车出海”的新市场增长点。在政府加大汽车出海政策支持力度下,根据中汽协数据,一季度的新能源汽车出口达24.8万辆,同比增长1.1倍。中国汽车行业持续深耕海外市场,出口…

SQL server入门一【简单介绍与简单建表】

SQLserver登录方式 Windows身份验证 用户名登录 通常登录名为sa,密码为下载时设置的密码 SQL server建立一个数据库 数据库中建表存储数据(输入命令建表) 数据库的简单介绍与概念 含义 可以对数据进行存储和管理的软件以及数据本身统称为数据库 组成 数据库由表…

微服务架构之RPC调用

在单体应用时,一次服务调用发生在同一台机器上的同一个进程内部,也就是说调用发生在本机内部,因此也被叫作本地方法调用。在进行服务化拆分之后,服务提供者和服务消费者运行在两台不同物理机上的不同进程内,它们之间的…

自建极简Ethercat主站-底层驱动编写

1、简介 MECM(Mini Ethercat Master),名字随便起的。已经学习了一段时间的Ethercat总线了,目前的想法就是自己简单实现一个Ethercat主站,没有太多的冗余功能,暂时不考虑太多的容错机制,仅实现目前用到的FO…

性能测试监控平台:InfluxDB+Grafana+Jmeter

前言 性能测试工具jmeter自带的监视器对性能测试结果的实时展示,在Windows系统下的GUI模式运行,渲染和效果不是太好,在linux环境下又无法实时可视化。 2023年最新出炉性能测试教程,真实企业性能压测全流程项目实战训练大合集&am…

整型在内存中的存储

目录 一、为什么内存中存储补码? 二、大小端概念 百度笔试试题: 几道小题: 一、为什么内存中存储补码? 上一节我们了解了原码,反码,补码的概念(http://t.csdn.cn/N0grg)&#xff…

1-1 统计数字问题

题目: 我的答案: 一、信息 二、分析 1.如何选择数据结构? 2.如何选择算法有很多思路? 3.如何用文件实现输入输出? 三、思考 疑问1 我选择了一开始数组选择使用数组是一个不错的选择,尤其在这个问题中…