用java实现扫雷小游戏,不再枯燥学语法(二)

写在开始

上一篇博客的链接为:用java实现扫雷小游戏,不再枯燥学语法(一)

任务清单

博主做这个项目给自己列的任务清单如下:

任务一:创建窗口(已完成)

任务二:窗口布局

任务三:定义数据结构

任务四:实现游戏的基础功能(布雷,查雷,排雷,判定输赢)

任务五:辅助功能(待开数,已开数,游戏重开,计时器)

代码实现

Windows.java

package game;

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

import static game.Game.*;

public class Windows{

//  创建公共静态对象方便调用
    public static JFrame frame=new JFrame();
    public static JButton jButton=new JButton();
    public static JLabel label1=new JLabel("待开:"+UNOPEN);
    public static JLabel label2=new JLabel("已开:"+OPENED);
    public static JLabel label3=new JLabel("用时:"+second+"s");

//  创建窗口
    public void createWindows(){
//      定义窗口大小(600*700)
        frame.setSize(600,700);
//      窗口是否可以改变大小
        frame.setResizable(false);
//      点击可关闭
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//      设置窗口布局
        frame.setLayout(new BorderLayout());
//      显示窗口
        frame.setVisible(true);
    }

    //  创建的按钮放窗口顶部
    public void setHeader(){
//      创建布局
        JPanel panel=new JPanel(new GridBagLayout());
        GridBagConstraints c1=new GridBagConstraints(0,0,3,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
        panel.add(jButton,c1);

//      设置透明度
        label1.setOpaque(true);
//      设置背景色
        label1.setBackground(Color.white);
//      设置边框颜色
        label1.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
//      label2、label3同理
        label2.setOpaque(true);
        label2.setBackground(Color.white);
        label2.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
        label3.setOpaque(true);
        label3.setBackground(Color.white);
        label3.setBorder(BorderFactory.createLineBorder(Color.LIGHT_GRAY));
//      设置三个状态显示栏
        GridBagConstraints c2=new GridBagConstraints(0,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
        panel.add(label1,c2);
        GridBagConstraints c3=new GridBagConstraints(1,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
        panel.add(label2,c3);
        GridBagConstraints c4=new GridBagConstraints(2,1,1,1,1.0,1.0,GridBagConstraints.CENTER,GridBagConstraints.BOTH,new Insets(0,0,0,0),0,0);
        panel.add(label3,c4);
//      添加至布局的上方
        frame.add(panel,BorderLayout.NORTH);
    }

//  设置按钮
    public void setButtons(){
//      创建容器
        Container container=new Container();
//      创建布局
        container.setLayout(new GridLayout(ROW,COL));
//      添加至整体布局的中央
        frame.add(container,BorderLayout.CENTER);
//      创建按钮
        for(int i=0;i<ROW;i++){
            for(int j=0;j<COL;j++){
                JButton btn=new JButton();
                btn.setOpaque(true);
                btn.setBackground(Color.yellow);
                container.add(btn);
                buttons[i][j]=btn;
            }
        }
    }

总结

这一部分主要就是运用swing组件和awt组件进行界面的布局,教程中用到的两种布局一种是GridBagLayout,另一种是GridLayout。

GridBagLayout设计理念是将父容器看作一个表格,表格中单元格的长宽可根据需求调整,通过竖线和横线的位置,来调整单元格大小,而不是、任意的设置单元格大小,组件可以放在一个或多个连续的单元格中,且这些连续单元格最后所构成的区域必须是一个方形区域。

比如说:我们想要完成这样的一个布局,如下图所示,我们该怎么做呢?

在这里插入图片描述
先来看一下GridBagLayout中GridBagConstraints的参数属性

变量名 作用
gridx 方格左上角单元格所在行号,行号在表格中以0开始,从左到右依次编号
gridy 方格左上角单元格所在列号,列号在表格中以0开始,从上到下依次编号
gridwidth 方格在横向占用的单元格数
gridheight 方格在纵向占用的单元格数
weightx 方格的长与表格长(即父容器的长)的比例,若为0,则为组件默认长度
weighty 方格的宽与表格宽(即父容器的宽)的比例,若为0,则为组件默认宽度

如下图所示,父容器被分割成3*3的表格,然后在该容器中分别放了方格1,方格2,方格3,以方格3为例,参数为:

gridx=0,gridy=2,gridwidth=2,gridheight=1,weightx=0.2,weighty=0.5

在这里插入图片描述
那么GridLayout又是一个什么样的布局呢?

GridLayout就是传统的网格布局,你只需要定义几行几列然后去依次添加组件就行了,十分方便。

结语

如果说这篇文章有让你学到一定的知识的话,不妨点个赞和关注,让博主能够看到。如果讲解中有什么错误和疏忽,也劳烦在评论中指出或提问,博主会第一时间进行更新和答复,谢谢!

发布了8 篇原创文章 · 获赞 10 · 访问量 319

猜你喜欢

转载自blog.csdn.net/weixin_44018540/article/details/103985013