java -新手笔记(Swing类)-开始制作消消乐(静态页面)

本文详细介绍了如何使用JavaSwing库创建一个简易的胡桃消消乐游戏,包括设置背景、创建卡片组件、动态布局和使用集合管理卡牌。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

自制类似羊了羊游戏 (胡桃消消乐)

swing定义

Swing是一个用于创建图形用户界面(GUI)的框架,类似弹窗口

基础 模版
        
        JFrame frame = new JFrame("My Swing Window");//创建一个窗口框架
        JPanel panel = new JPanel();//创建一个面板

        panel.setLayout(null);//设置页面布局为自定义(即后面需要自己定义位置,宽高)(可选)

         frame.add(panel);//将面板添加到框架中

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        //用于当用户取消该界面时,程序退出
      
        frame.setSize(496, 840);  // 设置窗口的大小
       
        frame.setLocationRelativeTo(null); // 居中显示 // 设置窗口的位置(可选)

         frame.setVisible(true); // 让窗口可见
        frame.setResizable(false); //设置窗口自由伸缩(可选)
         
设置背景 这边 是用方法调用
  public static void PaintBackground(JPanel panel){
      //传入面板,新建一个标签   jLabel是用于静态页面(不进行交互)
        JLabel jLabel1 = new JLabel(new ImageIcon("img/背景.jpg"));
      // ImageIcon是背景图标,需要新建,后面是文件地址
      jLabel1.setSize(480,800); //设置 标签宽高大小
        jLabel1.setLocation(0,0); //设置 位置方向位置
//可选  jLabel1.setBounds(0,0,480,800);//设置标签界限 即(位置 宽高)
        panel.add(jLabel1);
    }
 设置卡牌样式
         //设置 画一张卡牌
        JButton card = new JButton(new ImageIcon("img1/胡桃1.jpeg"));
       //card是可以消除的,用button实现用户交互
        // ImageIcon是背景图标,需要新建,后面是文件地址
        card.setSize(59,66);//设置card尺寸
        card.setLocation(20,50);//设置 card的位置
        //自定义button样式
        card.setName("胡桃搞笑");//设置button的名字
        card.setBorderPainted(true);//设置绘制的边框
        card.setContentAreaFilled(false);//设置点击是否有弹出的填充区域
        panel.add(card,0);//添加到面板中,设置一个出现的索引,不设置,系统会将这个button隐藏
遍历所有卡牌

这边事先创建了一个目录文件(装取图片)

String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};
//创建一个数组存储,为后面文件名可变易找寻,这边存储的是照片的名字

代码(这边只是遍历该数组,看一下显示的情况)

  String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};
        for (int i = 0; i < name.length; i++) {
//为了美观 列的个数为7,
            JButton card = new JButton(new ImageIcon("img1/"+name[i]+".jpeg"));
             card.setSize(59,66);
             card.setLocation(30+(i%7)*59,100+(i/7)*66);
             //i/7为行 ,i%7为列  一个周期为列的个数,宽度为就是30+(i%7)*59 高度100+(i/7)*66 


            //填充
            card.setName(name[i]);
            card.setBorderPainted(true);//设置绘制的边框
            card.setContentAreaFilled(false);
            panel.add(card,i);

        }java

运行图

设置集合

充满7*7的图层,集合可以方便乱序,我们只有将会改变的封装在Jbutton中就行

 public static LinkedList<JButton> createCards(){
        LinkedList<JButton> cards = new LinkedList<>();
        String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};//将图片名称存储为集合
这边是因文件名和卡牌名一致,只设置一个数组
        for (int j =0 ;j<9;j++) {
            for (int i = 0; i < name.length; i++) {
                JButton card = new JButton(new ImageIcon("img1/"+name[i]+".jpeg"));
//这边是总卡牌数是9*16张卡牌 
                //填充
                card.setName(name[i]);//设置 Jbutton card的名称
                cards.add(card);//将卡牌添加到集合中
//下面是重复性代码,后面会调用这个方法,没必要重复设置
//                card.setSize(59,66); 
//                    card.setLocation(30+(i%7)*59,100+(i/7)*63);
//                card.setBorderPainted(true);//设置绘制的边框
//                card.setContentAreaFilled(false);
//                panel.add(card,0);

            }
        }
        return cards;//返回集合<Jbutton>,便于操作集合乱序
    }
调用方法(存储卡牌的card样式),
形成第一个图层(49张排牌)) 
       LinkedList<JButton> cards = createCards();
        Collections.shuffle(cards);//乱序
        //第一层 7*7=49张卡牌
        for (int i = 0; i < 49; i++) {
            JButton card = cards.get(i);
            card.setSize(59,66);
            card.setLocation(30+(i%7)*59,100+(i/7)*63);
            card.setBorderPainted(true);//设置绘制的边框
            card.setContentAreaFilled(false);
            panel.add(card,0);//将卡牌显示到第一层(底层)

        }

运行图(这里是49张排牌)

第二层 排列 (36张牌)
       //第二层 6*6=36张卡牌
        for (int i = 0; i < 36; i++) {
            JButton card = cards.get(i+49);//集合是固定的,144张,前面已以及有49张
            card.setSize(59,66);
            card.setLocation(59+(i%6)*59,130+(i/6)*63);
//改变位置偏移(初始位置 width:30+(60/2),可以相等与原先位置(第一层)加上宽度一半, height = 100+(60/2),可以相等与原先位置(第一层)加上宽度一半)
            card.setBorderPainted(true);//设置绘制的边框
            card.setContentAreaFilled(false);
            panel.add(card,0);

        }

运行图

三层(7*5=35张牌)和四层(6*4=24张牌])
        //为了美观,这边错位使用半张牌差
        //第三层 7*5=35
        for (int i = 0; i < 35; i++) {
            JButton card = cards.get(i+49+36);
            card.setSize(59,66);
            card.setLocation(30+(i%7)*59,160+(i/7)*63);
//5行七列 初始值 宽 就是第一层宽初始值 高需要第一层初始值的加上一个(7-5)*30=60的高度
            card.setBorderPainted(true);//设置绘制的边框
            card.setContentAreaFilled(false);
            panel.add(card,0);

        }
       //        第四层 6*4=24
        for (int i = 0; i < 24; i++) {
            JButton card = cards.get(i+49+36+35);
            card.setSize(59,66);
            card.setLocation(60+(i%6)*59,195+(i/6)*63);
//4行6列 初始值 宽 就是第一层宽初始值+(7-6)*30(宽的一半) 高需要第一层初始值的加上一个(7-4)*30,90的高度
            card.setBorderPainted(true);//设置绘制的边框
            card.setContentAreaFilled(false);
            panel.add(card,0);

        }

运行图

简写 循环

主函数调用(多层数的卡牌图)

       LinkedList<JButton> cards = createCards();
        Collections.shuffle(cards);//第一次乱序
        putCards(49,0,7,30,100,panel,cards);
        putCards(36,49,6,60,130,panel,cards);
        putCards(35,49+36,7,30,160,panel,cards);
        putCards(24,49+36+35,6,60,195,panel,cards);
//主函数调用

 编写方法(多层数的卡牌图)

public static void putCards(int count , int offset ,int cols,int x,int y ,JPanel panel, LinkedList<JButton> cards  ){
        for (int i = 0; i < count; i++) {
            JButton card = cards.get(i+offset);
            card.setSize(59,66);
            card.setLocation(x+(i%cols)*59,y+(i/cols)*63);
            card.setBorderPainted(true);//设置绘制的边框
            card.setContentAreaFilled(false);
            panel.add(card,0);

        }

    }
//需要改变的数量,偏移量,行,x(宽的位置),y(高的位置),
//需要导入的Jbutton,Jpanel

设置 默认图片

 card.setDisabledIcon(new ImageIcon("img1/"+name[i]+"-1.jpeg"));//设置默认的图片

public static LinkedList<JButton> createCards(){
        LinkedList<JButton> cards = new LinkedList<>();
        String []name = {"胡桃1","胡桃2","胡桃3","胡桃4","胡桃5","胡桃6","胡桃7","胡桃8","胡桃9","胡桃10","胡桃11","胡桃12","胡桃13","胡桃14","胡桃15","胡桃16"};
        for (int j =0 ;j<9;j++) {
            for (int i = 0; i < name.length; i++) {
                JButton card = new JButton(new ImageIcon("img1/"+name[i]+".jpeg"));
              card.setDisabledIcon(new ImageIcon("img1/"+name[i]+"-1.jpeg"));//设置默认的图片
//                card.setSize(59,66);
//                    card.setLocation(30+(i%7)*59,100+(i/7)*63);
                //填充
                card.setName(name[i]);
                cards.add(card);

//                card.setBorderPainted(true);//设置绘制的边框
//                card.setContentAreaFilled(false);
//                panel.add(card,0);

            }
        }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值