java后端开发day25--阶段项目(二)

news2025/3/3 23:50:28

在这里插入图片描述
(以下内容全部来自上述课程)
在这里插入图片描述

1.美化界面

请添加图片描述

private void initImage() {
        //路径分两种:
        //1.绝对路径:从盘符开始写的路径   D:\\aaa\\bbb\\ccc.jpg
        //2.相对路径:从当前项目开始写的路径  aaa\\bbb\\ccc.jpg
        
        
        //添加图片的时候,就需要按照二维数组中管理的数据添加图片
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //获取二维数组中每个索引对应的数字
                int number = arr[i][j];
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(1));
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
            }
        }

        //细节:
        //先加载的图片在上方,后加载的图片在下方
        //添加背景图片
        ImageIcon background = new ImageIcon("image\\background\\background.jpg");
        JLabel backgroundJLabel = new JLabel(background);
        backgroundJLabel.setBounds(40,40,508,560);
        //把背景图片添加到界面中
        this.getContentPane().add(backgroundJLabel);
    }

2.上下移动

上移动:
向上移动实际上就是把空白方块下方的图片上移。
请添加图片描述
(新加代码,非完整)


public class GameJFrame extends javax.swing.JFrame implements KeyListener {
  
    //记录空白方块的位置
    int x = 0;
    int y = 0;

    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();
       }

    private void initJFrame() {
 
        //给整个界面添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {

    }

    @Override
    public void keyReleased(KeyEvent e) {
        //对应键盘上的上下左右键
        //获取键盘上的键码
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 38) {
            System.out.println("上");
            if (x == 3) {
                //已经到底了,什么都不做
                return;
            }
            //逻辑:
            //把空白方块下方的数字往上移动
            //x,y  表示空白方块
            //x+1,y  表示空白方块上的位置
            //把x+1,y位置上的数字赋值给x,y位置
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            //空白方块的位置发生了改变
            x++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 40) {
            if (x == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("下");
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            //空白方块的位置发生了改变
            x--;
            //重新初始化图片
            initImage();

        } else if (keyCode == 37) {
            if (y == 3) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("左");
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            //空白方块的位置发生了改变
            y++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 39) {
            if (y == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("右");
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            //空白方块的位置发生了改变
            y--;
            //重新初始化图片
            initImage();

        } else {
            System.out.println("其他");
        }

    }
}

3.查看完整图片的功能

按住A不松开,显示完整图片
松开A显示随机打乱的图片
(新加代码,非完整)

    //定义一个变量,记录当前展示图片的路径
    String path = "";
    
    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();
        //..........

        //刷新界面
        this.getContentPane().repaint();
    }
        //监听上一步添加过了,直接用,修改方法即可

    //按下不松,一直触发
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65) {
            //把界面中的所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
           JLabel allJLabel = new JLabel(new ImageIcon(path+"all.jpg"));
            //设置图片的位置
            allJLabel.setBounds(83,134,420,420);
            //把图片添加到界面中
            this.getContentPane().add(allJLabel);
            //加载背景图片
            ImageIcon background = new ImageIcon("image\\background\\background.jpg");
            JLabel backgroundJLabel = new JLabel(background);
            backgroundJLabel.setBounds(40,40,508,560);

            //把背景图片添加到界面中
            this.getContentPane().add(backgroundJLabel);
            //刷新界面
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
		//...........
        } else if( keyCode == 65){
            initImage();
        }

    }
}

4.作弊码

按一下W,直接胜利
keyReleased方法体中添加:
(新加代码,非完整)

else if (keyCode == 87) {
             arr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
             initImage();

5.判断胜利

其实就是判断二维数组中的数字是否按照顺序进行排列
如果按照顺序进行排列的,那么显示胜利的图片

实现步骤:

  1. 定义一个正确的二维数组win
  2. 在加载图片之前,先判断一下二维数组中的数字跟win数组中是否相同
  3. 如果相同展示正确图标
  4. 如果不同则不展示正确图标

(新加代码,非完整)

//定义一个二维数组,存储正确的数据
    int[][] win = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

private void initImage() {
//....

//判断游戏是否结束
        if (isWin()) {
            //显示胜利的图片
            ImageIcon winIcon = new ImageIcon("image\\win.jpg");
            JLabel winJLabel = new JLabel(winIcon);
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }

//........
}

public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利,如果胜利,此方法直接结束
        if (isWin()) {
            //1.返回结果
            //2.结束方法
            return;
//........
        }
}

 //判断游戏是否胜利
    public boolean isWin(){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

6.计步功能

//定义变量,记录步数
    int step = 0;

private void initImage() {
//........
JLabel stepCount = new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);

//........
}

// keyReleased  截止到现在的完整代码

 @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利,如果胜利,此方法直接结束
        if (isWin()) {
            //1.返回结果
            //2.结束方法
            return;
        }

        //对应键盘上的上下左右键
        //获取键盘上的键码
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 38) {
            System.out.println("上");
            if (x == 3) {
                //已经到底了,什么都不做
                return;
            }
            //逻辑:
            //把空白方块下方的数字往上移动
            //x,y  表示空白方块
            //x+1,y  表示空白方块上的位置
            //把x+1,y位置上的数字赋值给x,y位置
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            //空白方块的位置发生了改变
            x++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 40) {
            if (x == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("下");
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            //空白方块的位置发生了改变
            x--;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 37) {
            if (y == 3) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("左");
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            //空白方块的位置发生了改变
            y++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 39) {
            if (y == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("右");
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            //空白方块的位置发生了改变
            y--;
            step++;
            //重新初始化图片
            initImage();

        } else if( keyCode == 65){
            initImage();
        } else if (keyCode == 87) {
             arr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
             initImage();
        }

    }

7.菜单功能

1.重新开始

  1. 给重新游戏绑定点击事件---------->ActionListener
  2. 重新打乱二维数组中的数字
  3. 加载图片
  4. 计步器清零

2.关闭游戏

  1. 给关闭游戏绑定事件
  2. 结束虚拟机,关闭所有

3.关于我们

请添加图片描述

4.代码

(新加代码,非完整)

public class GameJFrame extends javax.swing.JFrame implements KeyListener , ActionListener {
 		//把条目添加到选项中  -----   移到成员位置
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);
        aboutJMenu.add(accountItem);

}

 private void initJMenuBar() {
 //.........
 		//给条目绑定事件
        replayJMenuItem.addActionListener(this);
        reLoginJMenuItem.addActionListener(this);
        closeJMenuItem.addActionListener(this);
        accountItem.addActionListener(this);
}
//initData  截止到现在的完整代码
 private void initData() {

                //1.定义一个一维数组
                int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

                //2.随机打乱一维数组中的数据
                for (int i = 0; i < tempArr.length; i++) {
                    //获取随机索引
                    int randomIndex = (int)(Math.random()*tempArr.length);
                    //拿着随机索引对应的值和i索引对应的值进行交换
                    int temp = tempArr[i];
                    tempArr[i] = tempArr[randomIndex];
                    tempArr[randomIndex] = temp;
                }

                //3.遍历一维数组
                for (int i = 0; i < tempArr.length; i++) {
                    if (tempArr[i] == 0) {
                        x = i / 4;
                        y = i % 4;
                    } 
                        arr[i / 4][i % 4] = tempArr[i];
                }
                System.out.println();
            }

 @Override
    public void actionPerformed(ActionEvent e) {

        //获取被点击的条目对象
        Object obj = e.getSource();
        if (obj == replayJMenuItem) {
            System.out.println("重新游戏");

            //步数清零
            step = 0;
            //重新打乱数据
            initData();
            //重新初始化图片
            initImage();

        } else if (obj == reLoginJMenuItem) {
            System.out.println("重新登录");
            //关闭当前登录的界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();

        } else if (obj == closeJMenuItem) {
            System.out.println("关闭游戏");
            System.exit(0);

        } else if (obj == accountItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器
            JLabel jLabel = new JLabel(new ImageIcon("image\\account.jpg"));
            //设置位置和宽高
            jLabel.setBounds(0,0,258,258);
            //把图片添加到弹窗中
            jDialog.getContentPane().add(jLabel);
            //设置弹窗的宽高
            jDialog.setSize(280,316);
            //设置弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //设置弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);
        }
    }

8.游戏打包exe(概括)

  1. 一定要包含图形化界面
  2. 代码要打包起来
  3. 游戏用到的图片也要打包起来
  4. JDK也要打包起来

步骤:

  1. 把所有代码打包成一个压缩包,jar后缀的压缩包
  2. 把jar包转换成exe安装包
  3. 把第二步的exe,图片,JDK整合在一起,变成最终的exe安装包

9.所有完整代码

1.GameJFrame

package com.woziji.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import javax.swing.border.Border;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;


public class GameJFrame extends javax.swing.JFrame implements KeyListener , ActionListener {
    //JFrame 界面,窗体
    //子类呢? 也表示界面,窗体
    //规定:GameJFrame 表示游戏的主界面
    //以后和游戏相关的所有逻辑都写在这个类中

    //用来管理数据
    int[][] arr = new int[4][4];

    //记录空白方块的位置
    int x = 0;
    int y = 0;

    //定义一个变量,记录当前展示图片的路径
    String path = "";

    //定义一个二维数组,存储正确的数据
    int[][] win = {{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};

    //定义变量,记录步数
    int step = 0;


    //创建选项下面的条目对象
    JMenuItem replayJMenuItem = new JMenuItem("重新游戏");
    JMenuItem reLoginJMenuItem = new JMenuItem("重新登录");
    JMenuItem closeJMenuItem = new JMenuItem("关闭游戏");

    JMenuItem accountItem = new JMenuItem("公众号");


    public GameJFrame() {
        //初始化界面
        initJFrame();

        //初始化菜单
        initJMenuBar();

        //初始化数据(打乱)
        initData();

        //初始化图片
        initImage();

        //让界面显示出来,建议写在最后
        this.setVisible(true);
    }


    private void initData() {

                //1.定义一个一维数组
                int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};

                //2.随机打乱一维数组中的数据
                for (int i = 0; i < tempArr.length; i++) {
                    //获取随机索引
                    int randomIndex = (int)(Math.random()*tempArr.length);
                    //拿着随机索引对应的值和i索引对应的值进行交换
                    int temp = tempArr[i];
                    tempArr[i] = tempArr[randomIndex];
                    tempArr[randomIndex] = temp;
                }

                //3.遍历一维数组
                for (int i = 0; i < tempArr.length; i++) {
                    if (tempArr[i] == 0) {
                        x = i / 4;
                        y = i % 4;
                    }
                        arr[i / 4][i % 4] = tempArr[i];
                }
                System.out.println();
            }

    private void initImage() {
        //清空原本已经出现的图片
        this.getContentPane().removeAll();

        //判断游戏是否结束
        if (isWin()) {
            //显示胜利的图片
            ImageIcon winIcon = new ImageIcon("image\\win.jpg");
            JLabel winJLabel = new JLabel(winIcon);
            winJLabel.setBounds(203,283,197,73);
            this.getContentPane().add(winJLabel);
        }


        JLabel stepCount = new JLabel("步数:"+step);
        stepCount.setBounds(50,30,100,20);
        this.getContentPane().add(stepCount);



        //路径分两种:
        //1.绝对路径:从盘符开始写的路径   D:\\aaa\\bbb\\ccc.jpg
        //2.相对路径:从当前项目开始写的路径  aaa\\bbb\\ccc.jpg


        //添加图片的时候,就需要按照二维数组中管理的数据添加图片
        //外循环----把内循环的代码重复执行4次
        for (int i = 0; i < 4; i++) {
            //内循环----表示在一行中放4个图片
            for (int j = 0; j < 4; j++) {
                //获取二维数组中每个索引对应的数字
                int number = arr[i][j];
                //创建一个图片ImageIcon对象     参数:图片的路径(没加图片,意思一下得了)
                //这里的图片最好命名为数字
                ImageIcon icon = new ImageIcon("image\\background\\"+number+".jpg");
                //创建一个JLabel对象(管理容器)
                JLabel jLabel = new JLabel(icon);
                //设置图片的位置
                jLabel.setBounds(105*j+83,105*i+134,105,105);
                //给图片添加边框
                jLabel.setBorder(new BevelBorder(1));
                //把JLabel对象添加到界面中
                this.getContentPane().add(jLabel);
                //添加一次后number自增1,表示下一次加载后面一张图片
            }
        }

        //细节:
        //先加载的图片在上方,后加载的图片在下方
        //添加背景图片
        ImageIcon background = new ImageIcon("image\\background\\background.jpg");
        JLabel backgroundJLabel = new JLabel(background);
        backgroundJLabel.setBounds(40,40,508,560);
        //把背景图片添加到界面中
        this.getContentPane().add(backgroundJLabel);

        //刷新界面
        this.getContentPane().repaint();
    }

    private void initJMenuBar() {
        //创建整个的菜单对象
        JMenuBar JMenuBar = new JMenuBar();

        //创建菜单上面的两个选项的对象  (功能  关于我们)
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        //把条目添加到选项中
        functionJMenu.add(replayJMenuItem);
        functionJMenu.add(reLoginJMenuItem);
        functionJMenu.add(closeJMenuItem);

        aboutJMenu.add(accountItem);

        //把选项添加到菜单中
        JMenuBar.add(functionJMenu);
        JMenuBar.add(aboutJMenu);

        //把菜单设置到界面中
        this.setJMenuBar(JMenuBar);

        //给条目绑定事件
        replayJMenuItem.addActionListener(this);
        reLoginJMenuItem.addActionListener(this);
        closeJMenuItem.addActionListener(this);
        accountItem.addActionListener(this);
    }

    private void initJFrame() {
        //设置界面的宽高
        this.setSize(603,680);
        //设置界面的标题
        this.setTitle("拼图单机版 v1.0");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
        //取消默认的居中放置,只有取消了才可以设置坐标
        this.setLayout(null);
        //给整个界面添加键盘监听
        this.addKeyListener(this);
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }
    //按下不松,一直触发
    @Override
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if (code == 65) {
            //把界面中的所有图片全部删除
            this.getContentPane().removeAll();
            //加载第一张完整的图片
           JLabel allJLabel = new JLabel(new ImageIcon(path+"all.jpg"));
            //设置图片的位置
            allJLabel.setBounds(83,134,420,420);
            //把图片添加到界面中
            this.getContentPane().add(allJLabel);
            //加载背景图片
            ImageIcon background = new ImageIcon("image\\background\\background.jpg");
            JLabel backgroundJLabel = new JLabel(background);
            backgroundJLabel.setBounds(40,40,508,560);

            //把背景图片添加到界面中
            this.getContentPane().add(backgroundJLabel);
            //刷新界面
            this.getContentPane().repaint();
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {
        //判断游戏是否胜利,如果胜利,此方法直接结束
        if (isWin()) {
            //1.返回结果
            //2.结束方法
            return;
        }

        //对应键盘上的上下左右键
        //获取键盘上的键码
        int keyCode = e.getKeyCode();
        System.out.println(keyCode);
        if (keyCode == 38) {
            System.out.println("上");
            if (x == 3) {
                //已经到底了,什么都不做
                return;
            }
            //逻辑:
            //把空白方块下方的数字往上移动
            //x,y  表示空白方块
            //x+1,y  表示空白方块上的位置
            //把x+1,y位置上的数字赋值给x,y位置
            arr[x][y] = arr[x+1][y];
            arr[x+1][y] = 0;
            //空白方块的位置发生了改变
            x++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 40) {
            if (x == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("下");
            arr[x][y] = arr[x-1][y];
            arr[x-1][y] = 0;
            //空白方块的位置发生了改变
            x--;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 37) {
            if (y == 3) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("左");
            arr[x][y] = arr[x][y+1];
            arr[x][y+1] = 0;
            //空白方块的位置发生了改变
            y++;
            step++;
            //重新初始化图片
            initImage();

        } else if (keyCode == 39) {
            if (y == 0) {
                //已经到底了,什么都不做
                return;
            }
            System.out.println("右");
            arr[x][y] = arr[x][y-1];
            arr[x][y-1] = 0;
            //空白方块的位置发生了改变
            y--;
            step++;
            //重新初始化图片
            initImage();

        } else if( keyCode == 65){
            initImage();
        } else if (keyCode == 87) {
             arr = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,0}
            };
             initImage();
        }

    }

    //判断游戏是否胜利
    public boolean isWin(){
        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                if (arr[i][j] != win[i][j]){
                    return false;
                }
            }
        }
        return true;
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        //获取被点击的条目对象
        Object obj = e.getSource();
        if (obj == replayJMenuItem) {
            System.out.println("重新游戏");

            //步数清零
            step = 0;
            //重新打乱数据
            initData();
            //重新初始化图片
            initImage();

        } else if (obj == reLoginJMenuItem) {
            System.out.println("重新登录");
            //关闭当前登录的界面
            this.setVisible(false);
            //打开登录界面
            new LoginJFrame();

        } else if (obj == closeJMenuItem) {
            System.out.println("关闭游戏");
            System.exit(0);

        } else if (obj == accountItem) {
            System.out.println("公众号");
            //创建一个弹窗对象
            JDialog jDialog = new JDialog();
            //创建一个管理图片的容器
            JLabel jLabel = new JLabel(new ImageIcon("image\\account.jpg"));
            //设置位置和宽高
            jLabel.setBounds(0,0,258,258);
            //把图片添加到弹窗中
            jDialog.getContentPane().add(jLabel);
            //设置弹窗的宽高
            jDialog.setSize(280,316);
            //设置弹窗置顶
            jDialog.setAlwaysOnTop(true);
            //设置弹窗居中
            jDialog.setLocationRelativeTo(null);
            //弹框不关闭无法操作下面的界面
            jDialog.setModal(true);
            //让弹窗显示出来
            jDialog.setVisible(true);
        }
    }
}

2.LoginJFrame

package com.woziji.ui;

import javax.swing.*;

public class LoginJFrame extends javax.swing.JFrame{
    //登录界面
    //以后和登录相关的所有逻辑都写在这个类中
    public LoginJFrame(){
        //在创建登陆界面的时候,同时给这个界面去设置一些信息
        //比如:宽高,直接展示出来

        this.setSize(488,430);
        this.setVisible(true);
        //设置界面的标题
        this.setTitle("拼图 登录");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

3.RegisterJFrame

package com.woziji.ui;

public class RegisterJFrame extends javax.swing.JFrame{
    //注册界面
    //以后和注册相关的所有逻辑都写在这个类中
    public RegisterJFrame(){
        this.setSize(488,500);
        this.setVisible(true);
        //设置界面的标题
        this.setTitle("拼图 注册");
        //设置界面置顶
        this.setAlwaysOnTop(true);
        //设置界面居中
        this.setLocationRelativeTo(null);
        //设置界面的关闭方式
        this.setDefaultCloseOperation(3);
    }
}

4.主入口

import com.woziji.ui.GameJFrame;
import com.woziji.ui.LoginJFrame;
import com.woziji.ui.RegisterJFrame;

public class App {
    public static void main(String[] args) {
        //表示程序的入口
        //如果我们想开启一个界面,就创建谁的对象
        //new LoginJFrame();
        //new RegisterJFrame();
        new GameJFrame();

    }
}

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【 开发知识点 一 】 随机数生成器 /dev/urandom 和 /dev/random

文章目录 一、随机数生成器 是什么 ?二、为什么 需要 随机数生成器 ?三、随机数生成器 基本原理四、随机数生成器 三个输出接口五、随机生成器 应用1、简单应用2、项目应用一、随机数生成器 是什么 ? /dev/random 和 /dev/urandom 是 Linux 上的字符设备文件,它们是随机数…

(动态规划 最长递增的子序列)leetcode 300

这道题我第一眼反应就是暴力&#xff0c;但是暴力的话就是n*n-1*n-2*...n-(n-1) 也就是O(n^n)dfs做绝对超时 贪心也不行&#xff0c;这里是子序列&#xff0c;要考虑在ni的范围内考虑多种路线取最优&#xff0c;所以用动态规划 如何用动态规划呢&#xff1f; 答&#xff1a;…

小皮网站搭建

前提&#xff1a;小皮的安装下载 1、在www目录下创建一个新的文件夹&#xff0c;用来存放网站源码&#xff1b; 2、安装数据库管理工具phpMyadmin 3、新建数据表 添加字段 4、创建网站 5、前端的登录代码 注册 后端php 网页展示 登录成功跳转welcome.php

【CSS—前端快速入门】CSS 常用样式

CSS 常用 CSS 样式 1. 前端样式查询网站&#xff1a; MDN Web Docs (mozilla.org) w3school 2. border 2.1 借助 MDN 了解 border 我们借助 MDN 网站来学习 border 样式的使用&#xff1a; 2.2 border 常见属性 保存代码&#xff0c;打开页面&#xff1a; 对于标签不同样式的…

(七)消息队列-Kafka 序列化avro(传递)

&#xff08;七&#xff09;消息队列-Kafka 序列化avro&#xff08;传递&#xff09; 客从远方来&#xff0c;遗我双鲤鱼。呼儿烹鲤鱼&#xff0c;中有尺素书。 ——佚名《饮马长城窟行》 本文已同步CSDN、掘金平台、知乎等多个平台&#xff0c;图片依然保持最初发布的水印&…

springboot使用redis

springboot使用redis redis-service.exe : 服务端,启动后不要关闭 redis-cli.exe : 客户端,访问redis中的数据 redisclient-win32.x86_64.2.0.jar : redis的图形界面客户端,执行方式是在这个文件的目录执行 java -jar redisclient-win32.x86_64.2.0.jar或者在这个jar包的目录…

【实战篇】【深度解析DeepSeek:从机器学习到深度学习的全场景落地指南】

一、机器学习模型:DeepSeek的降维打击 1.1 监督学习与无监督学习的"左右互搏" 监督学习就像学霸刷题——给标注数据(参考答案)训练模型。DeepSeek在信贷风控场景中,用逻辑回归模型分析百万级用户数据,通过特征工程挖掘出"凌晨3点频繁申请贷款"这类魔…

SpringBoot高校运动会管理系统 附带详细运行指导视频

文章目录 一、项目演示二、项目介绍三、运行截图四、主要代码1.报名赛事代码2.用户登录代码3.保存成绩代码 一、项目演示 项目演示地址&#xff1a; 视频地址 二、项目介绍 项目描述&#xff1a;这是一个基于SpringBoot框架开发的高校运动会管理系统项目。首先&#xff0c;这…

【Linux网络-HTTP协议】HTTP基础概念+构建HTTP

代码定位&#xff1a;南毅c/Linux - Gitee.com HTTP协议 介绍 虽然我们说&#xff0c;应用层协议是我们程序猿自己定的.但实际上,已经有大佬们定义了一些现成的,又非常好用的应用层协议,供我们直接参考使用。HTTP(超文本传输协议)就是其中之一。 在互联网世界中&#xff0c…

高频 SQL 50 题(基础版)_626. 换座位

高频 SQL 50 题&#xff08;基础版&#xff09;_626. 换座位 select(case when mod(id,2)!0 AND counts ! id then id1when mod(id,2)!0 AND counts id then idelse id -1end) as id,student fromseat,(selectcount(*) as countsfrom seat) as seat_counts order by id asc;

python第十一课:并发编程 | 多任务交响乐团

&#x1f3af; 本节目标 理解多线程/多进程/协程的应用场景掌握threading与multiprocessing核心用法学会使用asyncio进行异步编程开发实战项目&#xff1a;高并发爬虫引擎破解GIL锁的性能迷思 1️⃣ 并发编程三剑客 &#x1f3bb; 生活化比喻&#xff1a; 多线程 → 餐厅多个…

基于 Flink CDC YAML 的 MySQL 到 Kafka 流式数据集成

本教程的演示都将在 Flink CDC CLI 中进行&#xff0c;无需一行 Java/Scala 代码&#xff0c;也无需安装 IDE。 这篇教程将展示如何基于 Flink CDC YAML 快速构建 MySQL 到 Kafka 的 Streaming ELT 作业&#xff0c;包含整库同步、表结构变更同步演示和关键参数介绍。 准备阶段…

解决 ERROR 1130 (HY000): Host is not allowed to connect to this MySQL server

当使用 MySQL 时&#xff0c;您可能会遇到错误信息“ERROR 1130 (HY000): Host ‘hostname’is not allowed to connect to this MySQL server”这是 MySQL 用于防止未经授权的访问的标准安全特性。实际上&#xff0c;服务器还没有配置为接受来自相关主机的连接。 Common Caus…

科普|无人机专业术语

文章目录 前言一、飞控二、电调三、通道四、2S、3S、4S电池五、电池后面C是什么意思?六、电机的型号七、什么是电机的KV值?八、螺旋桨的型号九、电机与螺旋桨的搭配 前言 无人机飞控系统控制飞行姿态&#xff0c;电调控制电机转速&#xff0c;遥控器通道控制飞行动作。电池C…

Qt:窗口

目录 菜单栏 QMenuBar 菜单添加快捷键 添加子菜单 添加分割线和添加图标 QMenuBar创建方式 工具栏 QToolBar 和菜单栏搭配 创建多个工具栏 状态栏 QStatusBar 状态栏中添加其他控件 浮动窗口 QDockWidget 对话框 对话框的内存释放问题 自定义对话框界面 模态对话…

深入浅出 Go 语言:协程(Goroutine)详解

深入浅出 Go 语言&#xff1a;协程(Goroutine)详解 引言 Go 语言的协程&#xff08;goroutine&#xff09;是其并发模型的核心特性之一。协程允许你轻松地编写并发代码&#xff0c;而不需要复杂的线程管理和锁机制。通过协程&#xff0c;你可以同时执行多个任务&#xff0c;并…

Python从0到100(八十九):Resnet、LSTM、Shufflenet、CNN四种网络分析及对比

前言&#xff1a; 零基础学Python&#xff1a;Python从0到100最新最全教程。 想做这件事情很久了&#xff0c;这次我更新了自己所写过的所有博客&#xff0c;汇集成了Python从0到100&#xff0c;共一百节课&#xff0c;帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

实验:k8s+keepalived+nginx+iptables

1、创建两个nginx的pod&#xff0c;app都是nginx nginx1 nginx2 2、创建两个的pod的service 3、配置两台keepalived的调度器和nginx七层反向代理&#xff0c;VIP设置192.168.254.110 keepalived调度器master keepalived调度器backup 两台调度器都配置nginx七层反向代理&#…

LlamaFactory-webui:训练大语言模型的入门级教程

LlamaFactory是一个开源框架&#xff0c;支持多种流行的语言模型&#xff0c;及多种微调技术&#xff0c;同时&#xff0c;以友好的交互式界面&#xff0c;简化了大语言模型的学习。 本章内容&#xff0c;从如何拉取&#xff0c;我已经搭建好的Llamafactory镜像开始&#xff0…

手机打电话时如何识别对方按下的DTMF按键的字符-安卓AI电话机器人

手机打电话时如何识别对方按下的DTMF按键的字符 --安卓AI电话机器人 一、前言 前面的篇章中&#xff0c;使用蓝牙电话拦截手机通话的声音&#xff0c;并对数据加工&#xff0c;这个功能出来也有一段时间了。前段时间有试用的用户咨询说&#xff1a;有没有办法在手机上&#xff…