java实战项目--拼图小游戏(附带全套源代码)

  • 个人主页VON

  • 所属专栏java实战项目
  • 游戏参考黑马程序员

一、效果展示

二、功能介绍

游戏中所有的图片以及代码均已打包,玩家直接安装游戏即可,不用idea也可以畅玩。

游戏功能比较单一,只有简单的拼图功能。

  • a:展示原图
  • 重新游戏:图片会被重新打乱
  • 控制:上下左右来控制空白格子的移动

三、代码分析

1、初始化界面

//初始化界面private void initJFame() {//设置窗口大小this.setSize(603, 680);//设置窗口标题this.setTitle("拼图小游戏");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置关闭方式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默认居中放置this.setLayout(null);//添加键盘监听事件this.addKeyListener(this);}

设置窗口大小:

this.setSize(603, 680);

这行代码设置窗口的大小为宽度603像素,高度680像素。

设置窗口标题:

this.setTitle("拼图小游戏");

这行代码设置窗口的标题为 "拼图小游戏"。

设置界面置顶:

this.setAlwaysOnTop(true);

这行代码将窗口设置为总是置顶,即无论其他窗口如何操作,该窗口始终在最上层显示。

设置界面居中:

this.setLocationRelativeTo(null);

这行代码将窗口设置为居中显示在屏幕上,参数 null 表示相对于屏幕居中。

设置关闭方式:

this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

这行代码设置窗口关闭时的默认操作,即关闭窗口时退出程序。

取消默认居中放置:

this.setLayout(null);

这行代码取消了窗口默认的布局管理器,将布局设置为手动控制位置和大小。

添加键盘监听事件:

this.addKeyListener(this);

这行代码将当前对象添加为键盘事件的监听器,以便处理键盘输入事件。

2、初始化菜单

//初始化菜单private void initJMenuBar() {//整个菜单对象JMenuBar jMenuBar = new JMenuBar();//菜单选项JMenu function = new JMenu("功能");JMenu about = new JMenu("关于我们");JMenu help = new JMenu("支持一下");//将条目添加到菜单中function.add(replayItem);function.add(closeItem);about.add(accountItem);help.add(pay);//给条目绑定事件replayItem.addActionListener(this);closeItem.addActionListener(this);accountItem.addActionListener(this);pay.addActionListener(this);//将菜单添加到菜单对象中jMenuBar.add(function);jMenuBar.add(about);jMenuBar.add(help);//给界面设置菜单this.setJMenuBar(jMenuBar);}

创建菜单对象:

JMenuBar jMenuBar = new JMenuBar();

创建了一个 JMenuBar 对象 jMenuBar,用于存放整个菜单栏。

创建菜单选项:

JMenu function = new JMenu("功能");
JMenu about = new JMenu("关于我们");
JMenu help = new JMenu("支持一下");

创建了三个菜单选项:functionabouthelp,分别用于显示 "功能"、"关于我们" 和 "支持一下"。

添加菜单条目:

function.add(replayItem);
function.add(closeItem);about.add(accountItem);help.add(pay);

将具体的菜单条目 replayItemcloseItemaccountItempay 分别添加到对应的菜单中。这些条目是 JMenuItem 对象,用于表示菜单中的具体选项。

绑定事件监听器:

replayItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
pay.addActionListener(this);

给每个菜单条目添加事件监听器,这里 this 是当前类的实例,实现了 ActionListener 接口,用于处理菜单项的点击事件。

将菜单添加到菜单对象中:

jMenuBar.add(function);
jMenuBar.add(about);
jMenuBar.add(help);

将创建好的菜单选项 functionabouthelp 分别添加到菜单栏对象 jMenuBar 中。

设置界面的菜单栏:

this.setJMenuBar(jMenuBar);

最后,将整个菜单栏 jMenuBar 设置为当前界面的菜单栏,以使菜单栏显示在界面顶部。

3、初始化图片

//初始化图片private void initImage() {//清除原本已经出现的所有图片this.getContentPane().removeAll();//判断是否胜利if(isWin()){//显示胜利的图标JLabel win = new JLabel(new ImageIcon("image\\win.png"));win.setBounds(203,283,197,73);this.getContentPane().add(win);}JLabel stepCount = new JLabel("步数:"+count);stepCount.setBounds(50, 30, 100, 20);this.getContentPane().add(stepCount);//先加载的图片在上方,后添加的在下方//添加图片//添加行for (int i = 0; i < 4; i++) {//添加列for (int j = 0; j < 4; j++) {//获取要加载图片的序号int number=data[i][j];//创建ImageIcon对象ImageIcon icon = new ImageIcon(path+number+ ".jpg");//创建JLabel对象(管理容器)JLabel jLabel = new JLabel(icon);//设置图片位置jLabel.setBounds(105*j+83, 105*i+134, 105, 105);//给图片添加边框jLabel.setBorder(new BevelBorder(0));//将管理容器添加到界面this.getContentPane().add(jLabel);}}//添加背景图片//创建ImageIcon对象ImageIcon bgIcon = new ImageIcon("image\\background.png");//创建JLabel对象(管理容器)JLabel bg = new JLabel(bgIcon);//设置图片位置bg.setBounds(40, 40, 508, 560);//将管理容器添加到界面this.getContentPane().add(bg);//刷新一下界面this.getContentPane().repaint();}

清除原有图片:

this.getContentPane().removeAll();

这行代码的作用是清除当前界面上已经存在的所有组件,为后续的重新加载做准备。

判断是否胜利并显示胜利图标:

if (isWin()) {JLabel win = new JLabel(new ImageIcon("image\\win.png"));win.setBounds(203, 283, 197, 73);this.getContentPane().add(win);
}

如果 isWin() 方法返回 true,表示游戏已经胜利,那么会在界面上显示一个胜利的图标。图标的位置和大小由 setBounds() 方法指定。

显示步数信息:

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

在界面上显示当前的步数信息,步数由变量 count 提供,显示位置和大小也由 setBounds() 方法指定。

加载和显示拼图的小块:

for (int i = 0; i < 4; i++) {for (int j = 0; j < 4; j++) {int number = data[i][j];  // 获取要加载图片的序号ImageIcon icon = new ImageIcon(path + number + ".jpg");  // 创建 ImageIcon 对象JLabel jLabel = new JLabel(icon);  // 创建 JLabel 对象jLabel.setBounds(105 * j + 83, 105 * i + 134, 105, 105);  // 设置图片位置jLabel.setBorder(new BevelBorder(0));  // 给图片添加边框this.getContentPane().add(jLabel);  // 将图片添加到界面}
}

使用嵌套循环加载和显示一个 4x4 的拼图小块。data[i][j] 数组存储了每个拼图块的序号,通过拼接路径 path + number + ".jpg" 加载对应的图片。每个拼图小块用 JLabelImageIcon 来表示,位置由 setBounds() 方法设置,同时为每个图片添加了边框。

添加背景图片:

ImageIcon bgIcon = new ImageIcon("image\\background.png");
JLabel bg = new JLabel(bgIcon);
bg.setBounds(40, 40, 508, 560);
this.getContentPane().add(bg);

在界面上添加一个背景图片,该背景图片的位置和大小由 setBounds() 方法指定。

刷新界面:

this.getContentPane().repaint();

最后,调用 repaint() 方法刷新整个界面,确保所有修改和添加的组件都能立即显示出来。

4、打乱图片

//初始化数据(打乱图片)private void initdate() {int[]arr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};Random random=new Random();//打乱一维数组中的数据for (int i = 0; i < arr.length; i++) {int index= random.nextInt(arr.length);int temp=arr[i];arr[i]=arr[index];arr[index]=temp;}//将一维数组中的数据赋值给二维数组for (int i = 0; i < arr.length; i++) {if(arr[i]==0){x=i/4;y=i%4;}data[i/4][i%4]=arr[i];}}

定义和初始化数组:

int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15};

这里定义了一个长度为16的一维数组 arr,包含了数字0到15,用来表示拼图块的顺序。

打乱一维数组中的数据:

Random random = new Random();
for (int i = 0; i < arr.length; i++) {int index = random.nextInt(arr.length);int temp = arr[i];arr[i] = arr[index];arr[index] = temp;
}

使用 Random 类打乱一维数组 arr 中元素的顺序。在每次迭代中,生成一个随机的索引 index,然后交换当前索引 i 和随机索引 index 处的元素值,以达到打乱数组的效果。

将打乱后的一维数组赋值给二维数组 data

for (int i = 0; i < arr.length; i++) {if (arr[i] == 0) {x = i / 4;  // 计算空白块在二维数组中的行索引y = i % 4;  // 计算空白块在二维数组中的列索引}data[i / 4][i % 4] = arr[i];  // 将打乱后的值赋给二维数组 data
}

如果当前元素 arr[i] 的值为0,这表示找到了拼图中的空白块。通过计算可以确定空白块在二维数组 data 中的位置:行索引为 i / 4,列索引为 i % 4

然后,将打乱后的一维数组 arr 中的每个元素依次赋给二维数组 data,以初始化拼图的初始状态。

5、判断是否胜利

//初始化数据(打乱图片)private void initdate() {int[]arr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};Random random=new Random();//打乱一维数组中的数据for (int i = 0; i < arr.length; i++) {int index= random.nextInt(arr.length);int temp=arr[i];arr[i]=arr[index];arr[index]=temp;}//将一维数组中的数据赋值给二维数组for (int i = 0; i < arr.length; i++) {if(arr[i]==0){x=i/4;y=i%4;}data[i/4][i%4]=arr[i];}}
  • 双重循环遍历: 方法首先通过两个嵌套的 for 循环遍历二维数组 data。这个数组存储了当前拼图的布局状态。
  • 比较数组内容: 在每个位置 (i, j) 处,方法会比较 data[i][j] 和 right[i][j] 的值。
    • data 是当前拼图的状态数组。
    • right 可能是一个预设的正确的拼图状态数组,用来与当前拼图状态进行比较,判断是否完成。
  • 判断条件: 如果在任何位置 (i, j) 处,data[i][j] 不等于 right[i][j],则表示当前拼图状态与正确状态不符,直接返回 false,表示未完成胜利条件。
  • 完全相同返回true: 如果所有位置的数据都与 right 数组相同,则说明拼图已经按正确的顺序排列,返回 true,表示已经完成拼图,达到胜利条件。

 6、重写内容

按键响应

@Overridepublic void keyTyped(KeyEvent e) {}//按下不松时@Overridepublic void keyPressed(KeyEvent e) {int code = e.getKeyCode();if(code==65){//删除界面中的全部图片this.getContentPane().removeAll();//加载完整图片JLabel all = new JLabel(new ImageIcon(path+"all.jpg"));all.setBounds(83, 134, 420,420);this.getContentPane().add(all);//加载背景图片JLabel bg = new JLabel(new ImageIcon("image\\background.png"));bg.setBounds(40, 40, 508, 560);//将管理容器添加到界面this.getContentPane().add(bg);//刷新界面this.getContentPane().repaint();}}//松下按键时@Overridepublic void keyReleased(KeyEvent e) {//如果游戏胜利了,就不能够进行移动操作了if(isWin()){return;//直接退出该方法}//对上下左右进行判断int code=e.getKeyCode();switch (code){case 37: // 向左System.out.println("向左");if (y > 0) { // 检查是否还有空间向左移动data[x][y] = data[x][y-1];data[x][y-1] = 0;//每移动一次,步数加1count++;y--;}initImage();break;case 38: // 向上System.out.println("向上");if (x > 0) { // 检查是否还有空间向上移动data[x][y] = data[x-1][y];data[x-1][y] = 0;//每移动一次,步数加1count++;x--;}initImage();break;case 39: // 向右System.out.println("向右");if (y < data[0].length - 1) { // 检查是否还有空间向右移动data[x][y] = data[x][y+1];data[x][y+1] = 0;//每移动一次,步数加1count++;y++;}initImage();break;case 40: // 向下System.out.println("向下");if (x < data.length - 1) { // 检查是否还有空间向下移动data[x][y] = data[x+1][y];data[x+1][y] = 0;//每移动一次,步数加1count++;x++;}initImage();break;case 65:initImage();break;case 87://w键data=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};initImage();break;default:break;}}
方法说明
  • keyPressed(KeyEvent e) 方法响应按键按下事件。
  • keyReleased(KeyEvent e) 方法响应按键释放事件。
  • keyTyped(KeyEvent e) 方法在此处被省略,因为它通常用于处理按键输入,对于游戏中的按键操作可能不是必需的。
keyPressed(KeyEvent e) 方法分析
  • 当按键按下时,首先获取按键的键码 (e.getKeyCode())。
  • 如果按下的是键码为 65(对应于字母 'A'),则执行以下操作:
  • 移除当前容器中的所有组件 (this.getContentPane().removeAll()),通常用于清空当前界面。
  • 加载一个完整的图片 all.jpg,并创建一个 JLabel 来显示这个图片,设置其位置和大小。
  • 加载背景图片 background.png,同样创建一个 JLabel 并设置其位置和大小。
  • 将这些 JLabel 添加到界面的内容面板中 (this.getContentPane().add(...))。
  • 最后,调用 repaint() 方法来刷新界面,确保更新后的内容可见。
keyReleased(KeyEvent e) 方法分析
  • 首先检查游戏是否已经胜利(通过 isWin() 方法判断)。
  • 如果已经胜利,则直接返回,不执行后续的按键操作处理。
  • 如果游戏未胜利,则根据按键的不同键码执行相应的移动操作:
  • 37 表示向左移动,更新 data 数组中的元素位置,并调用 initImage() 方法更新界面。
  • 38 表示向上移动,同样更新 data 数组并刷新界面。
  • 39 表示向右移动,更新数组并刷新。
  • 40 表示向下移动,同样更新数组并刷新。
  • 65 键码表示重新初始化界面,调用 initImage() 方法。
  • 87 键码('W' 键)表示重置游戏的 data 数组为一个预设的初始状态,并刷新界面。

 功能实现

@Overridepublic void actionPerformed(ActionEvent e) {//获取被点击的菜单项Object source = e.getSource();if (source == replayItem) {System.out.println("重新游戏");//清零记步数count=0;//打乱二维数组的数据initdate();//重新加载图片initImage();} else if (source == closeItem) {System.out.println("关闭游戏");System.exit(0);}else if(source==accountItem){System.out.println("微信号");//创建一个弹框对象JDialog jDialog = new JDialog();//设置图片JLabel jLabel = new JLabel(new ImageIcon("image\\about.jpg"));//设置位置和宽高jLabel.setBounds(0,0,258,258);//将图片添加到弹框中jDialog.getContentPane().add(jLabel);//设置大小和位置jDialog.setSize(344,344);//弹框置顶jDialog.setAlwaysOnTop(true);//弹框默认是居中显示的jDialog.setLocationRelativeTo(null);//弹框不关闭则无法操作下面的界面jDialog.setModal(true);//让弹框显示出来jDialog.setVisible(true);}else if(source==pay){System.out.println("付款码");//创建一个弹框对象JDialog jDialog = new JDialog();//设置图片JLabel jLabel = new JLabel(new ImageIcon("image\\pay.jpg"));//设置位置和宽高jLabel.setBounds(0,0,258,258);//将图片添加到弹框中jDialog.getContentPane().add(jLabel);//设置大小和位置jDialog.setSize(344,344);//弹框置顶jDialog.setAlwaysOnTop(true);//弹框默认是居中显示的jDialog.setLocationRelativeTo(null);//弹框不关闭则无法操作下面的界面jDialog.setModal(true);//让弹框显示出来jDialog.setVisible(true);}}
replayItem(重新游戏)
  • 当用户点击 replayItem 菜单项时,打印出 "重新游戏"。
  • 将计步数 count 清零。
  • 调用 initdate() 方法,可能是用来打乱二维数组的数据。
  • 调用 initImage() 方法,重新加载图片,可能是重新初始化游戏界面的图片显示。
closeItem(关闭游戏)
  • 当用户点击 closeItem 菜单项时,打印出 "关闭游戏"。
  • 调用 System.exit(0) 来终止程序,退出游戏。
accountItem(微信号)pay(付款码)
  • 当用户点击 accountItem 菜单项时,创建一个 JDialog 对话框。
  • 在对话框中显示名为 "image\about.jpg" 的图片。
  • 设置对话框的大小为 344x344 像素,位置居中显示。
  • 将对话框设置为模态,即打开时阻止与其它窗口的交互。
  • 最后显示这个对话框。
  • 同样地,当用户点击 pay 菜单项时,创建另一个对话框来显示名为 "image\pay.jpg" 的图片,设置其属性并显示出来。

四、全套源码

package von.ui;import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;//与游戏相关的
public class GameJFrame extends JFrame implements KeyListener, ActionListener {//创建二维数组存储图片int[][]data=new int[4][4];//记录空白方块在数组中的位置int x=0;int y=0;//使用一个变量记录展示图片的路径前半段Random random=new Random();String[]type={"animal","girl","sport"};int num=random.nextInt(8)+1;String typeimage=type[random.nextInt(type.length)];String path="image\\"+typeimage+"\\"+typeimage+num+"\\";//定义一个二维数组用来存放正确是数据int[][]right=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};//计算步数int count =0;//菜单条目JMenuItem replayItem = new JMenuItem("重新游戏");JMenuItem closeItem = new JMenuItem("关闭游戏");JMenuItem accountItem = new JMenuItem("微信号");JMenuItem pay = new JMenuItem("付款码");public GameJFrame() {//初始化界面initJFame();//初始化菜单initJMenuBar();//初始化数据(打乱图片)initdate();//初始化图片initImage();//设置显示模式(写在最后)this.setVisible(true);}//初始化数据(打乱图片)private void initdate() {int[]arr={0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};Random random=new Random();//打乱一维数组中的数据for (int i = 0; i < arr.length; i++) {int index= random.nextInt(arr.length);int temp=arr[i];arr[i]=arr[index];arr[index]=temp;}//将一维数组中的数据赋值给二维数组for (int i = 0; i < arr.length; i++) {if(arr[i]==0){x=i/4;y=i%4;}data[i/4][i%4]=arr[i];}}//初始化图片private void initImage() {//清除原本已经出现的所有图片this.getContentPane().removeAll();//判断是否胜利if(isWin()){//显示胜利的图标JLabel win = new JLabel(new ImageIcon("image\\win.png"));win.setBounds(203,283,197,73);this.getContentPane().add(win);}JLabel stepCount = new JLabel("步数:"+count);stepCount.setBounds(50, 30, 100, 20);this.getContentPane().add(stepCount);//先加载的图片在上方,后添加的在下方//添加图片//添加行for (int i = 0; i < 4; i++) {//添加列for (int j = 0; j < 4; j++) {//获取要加载图片的序号int number=data[i][j];//创建ImageIcon对象ImageIcon icon = new ImageIcon(path+number+ ".jpg");//创建JLabel对象(管理容器)JLabel jLabel = new JLabel(icon);//设置图片位置jLabel.setBounds(105*j+83, 105*i+134, 105, 105);//给图片添加边框jLabel.setBorder(new BevelBorder(0));//将管理容器添加到界面this.getContentPane().add(jLabel);}}//添加背景图片//创建ImageIcon对象ImageIcon bgIcon = new ImageIcon("image\\background.png");//创建JLabel对象(管理容器)JLabel bg = new JLabel(bgIcon);//设置图片位置bg.setBounds(40, 40, 508, 560);//将管理容器添加到界面this.getContentPane().add(bg);//刷新一下界面this.getContentPane().repaint();}//初始化界面private void initJFame() {//设置窗口大小this.setSize(603, 680);//设置窗口标题this.setTitle("拼图小游戏");//设置界面置顶this.setAlwaysOnTop(true);//设置界面居中this.setLocationRelativeTo(null);//设置关闭方式this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//取消默认居中放置this.setLayout(null);//添加键盘监听事件this.addKeyListener(this);}//初始化菜单private void initJMenuBar() {//整个菜单对象JMenuBar jMenuBar = new JMenuBar();//菜单选项JMenu function = new JMenu("功能");JMenu about = new JMenu("关于我们");JMenu help = new JMenu("支持一下");//将条目添加到菜单中function.add(replayItem);function.add(closeItem);about.add(accountItem);help.add(pay);//给条目绑定事件replayItem.addActionListener(this);closeItem.addActionListener(this);accountItem.addActionListener(this);pay.addActionListener(this);//将菜单添加到菜单对象中jMenuBar.add(function);jMenuBar.add(about);jMenuBar.add(help);//给界面设置菜单this.setJMenuBar(jMenuBar);}@Overridepublic void keyTyped(KeyEvent e) {}//按下不松时@Overridepublic void keyPressed(KeyEvent e) {int code = e.getKeyCode();if(code==65){//删除界面中的全部图片this.getContentPane().removeAll();//加载完整图片JLabel all = new JLabel(new ImageIcon(path+"all.jpg"));all.setBounds(83, 134, 420,420);this.getContentPane().add(all);//加载背景图片JLabel bg = new JLabel(new ImageIcon("image\\background.png"));bg.setBounds(40, 40, 508, 560);//将管理容器添加到界面this.getContentPane().add(bg);//刷新界面this.getContentPane().repaint();}}//松下按键时@Overridepublic void keyReleased(KeyEvent e) {//如果游戏胜利了,就不能够进行移动操作了if(isWin()){return;//直接退出该方法}//对上下左右进行判断int code=e.getKeyCode();switch (code){case 37: // 向左System.out.println("向左");if (y > 0) { // 检查是否还有空间向左移动data[x][y] = data[x][y-1];data[x][y-1] = 0;//每移动一次,步数加1count++;y--;}initImage();break;case 38: // 向上System.out.println("向上");if (x > 0) { // 检查是否还有空间向上移动data[x][y] = data[x-1][y];data[x-1][y] = 0;//每移动一次,步数加1count++;x--;}initImage();break;case 39: // 向右System.out.println("向右");if (y < data[0].length - 1) { // 检查是否还有空间向右移动data[x][y] = data[x][y+1];data[x][y+1] = 0;//每移动一次,步数加1count++;y++;}initImage();break;case 40: // 向下System.out.println("向下");if (x < data.length - 1) { // 检查是否还有空间向下移动data[x][y] = data[x+1][y];data[x+1][y] = 0;//每移动一次,步数加1count++;x++;}initImage();break;case 65:initImage();break;case 87://w键data=new int[][]{{1,2,3,4},{5,6,7,8},{9,10,11,12},{13,14,15,0}};initImage();break;default:break;}}//判断是否胜利public boolean isWin(){for (int i = 0; i < data.length; i++) {for (int j = 0; j < data[i].length; j++) {if (data[i][j] != right[i][j]) {//只要有一个不同,就是falsereturn false;}}}//完全相同返回truereturn true;}@Overridepublic void actionPerformed(ActionEvent e) {//获取被点击的菜单项Object source = e.getSource();if (source == replayItem) {System.out.println("重新游戏");//清零记步数count=0;//打乱二维数组的数据initdate();//重新加载图片initImage();} else if (source == closeItem) {System.out.println("关闭游戏");System.exit(0);}else if(source==accountItem){System.out.println("微信号");//创建一个弹框对象JDialog jDialog = new JDialog();//设置图片JLabel jLabel = new JLabel(new ImageIcon("image\\about.jpg"));//设置位置和宽高jLabel.setBounds(0,0,258,258);//将图片添加到弹框中jDialog.getContentPane().add(jLabel);//设置大小和位置jDialog.setSize(344,344);//弹框置顶jDialog.setAlwaysOnTop(true);//弹框默认是居中显示的jDialog.setLocationRelativeTo(null);//弹框不关闭则无法操作下面的界面jDialog.setModal(true);//让弹框显示出来jDialog.setVisible(true);}else if(source==pay){System.out.println("付款码");//创建一个弹框对象JDialog jDialog = new JDialog();//设置图片JLabel jLabel = new JLabel(new ImageIcon("image\\pay.jpg"));//设置位置和宽高jLabel.setBounds(0,0,258,258);//将图片添加到弹框中jDialog.getContentPane().add(jLabel);//设置大小和位置jDialog.setSize(344,344);//弹框置顶jDialog.setAlwaysOnTop(true);//弹框默认是居中显示的jDialog.setLocationRelativeTo(null);//弹框不关闭则无法操作下面的界面jDialog.setModal(true);//让弹框显示出来jDialog.setVisible(true);}}
}

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

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

相关文章

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础

《汇编语言 基于x86处理器》- 读书笔记 - 第3章-汇编语言基础 3.1 基本语言元素3.1.1 第一个汇编语言程序常见汇编语言调用规范 3.1.2 整数常量&#xff08;基数、字面量&#xff09;3.1.3 整型常量表达式3.1.4 实数常量十进制实数十六进制实数&#xff08;编码实数&#xff09…

USB 2.0 协议专栏之 USB 2.0 概述(一)

前言&#xff1a;本篇博客为手把手教学的 USB 2.0 协议栈类精品博客&#xff0c;该专栏博客侧重针对 USB 2.0 协议进行讲解。Universal Serial Bus 作为如今最常见的通信接口&#xff0c;被广泛应用于&#xff1a;Keyboard、Mouse、Communication Device Class 和 Mass Storage…

“论企业集成架构设计及应用”写作框架,软考高级论文,系统架构设计师论文

原创范文 论企业集成架构设计及应用企业集成架构(Enterprise Integration Arhitecture&#xff0c;EIA) 是企业集成平台的核心&#xff0c;也是解决企业信息孤岛问题的关键。企业集成架构设计包括了企业信息、业务过程、应用系统集成架构的设计。实现企业集成的技术多种多样&a…

什么是 Windows 服务

什么是 Windows 服务 Windows 服务是 Windows 操作系统的核心。它们控制着操作系统的运行&#xff0c;定义了图形用户界面&#xff08;GUI&#xff09;与系统硬件之间的通信以及其他许多功能。没有这些服务&#xff0c;Windows 操作系统将无法正常运行。 对普通用户而言&…

【人工智能】人工智能概述(二)人工智能的关键技术

文章目录 一. 机器学习与深度学习1. 机器学习2. 深度学习 二. 计算机视觉1. 基本概念和分类2. 未来计算机视觉面临的主要挑战 三. 自然语言处理1. 基本概念与分类2. 自然语言处理面临的四大挑战 四. 知识图谱1. 基本概念2. 应用场景 五. SLAM技术1. 基本概念2. 主要分类 六. 人…

DSP教学实验箱_数字图像处理操作_案例分享:5-13 灰度图像二值化

一、实验目的 学习灰度图像二值化的原理&#xff0c;掌握图像的读取方法&#xff0c;并实现在LCD上显示二值化前后的图像。 二、实验原理 图像二值化 图像的二值化处理就是将图像上的点的灰度置为 0 或 255&#xff0c;也就是将整个图像呈现出明显的黑白效果。即将 256 个亮…

AJAX(1)——axios库的使用

什么是AJAX? AJAX是异步的JavaScript和XML。简单来说&#xff0c;就是使用XMLHttpRequest对象与服务器通信。它可以使用JSON,XML,HTML和text文本等格式发送和接收数据。AJAX最吸引人的就是它异步的特性&#xff0c;也就是说它可以在不重新刷新页面的情况下与服务器通信&#…

昇思25天学习打卡营第25天|LLM应用-基于MindNLP+MusicGen生成自己的个性化音乐

打卡 目录 打卡 应用任务简介 生成音乐 预训练权重模型下载 无提示生成 文本提示生成 音频提示生成 生成配置 应用任务简介 MusicGen 来自 Meta AI 的 Jade Copet 等人提出的基于单个语言模型&#xff08;LM&#xff09;的音乐生成模型&#xff0c;能够根据文本描述或…

NFS服务器环境搭建

1、什么是NFS ● 定义&#xff1a; NFS是一种在计算机系统之间共享文件和目录的协议&#xff0c;最初由Sun Microsystems开发&#xff0c;现在已经成为广泛使用的网络文件系统之一。 ● 核心功能&#xff1a; 通过网络&#xff08;特别是TCP/IP网络&#xff09;实现文件共享…

微信小程序配置访问服务器失败所发现的问题及解决方案

目录 事前现象问题1&#xff1a;问题现象&#xff1a;问题分析&#xff1a; 问题2&#xff1a;问题现象&#xff1a;问题分析&#xff1a;解决方案&#xff1a; 事后现象 事前现象 问题1&#xff1a; 问题现象&#xff1a; 在本地调试时&#xff0c;一切顺利&#xff0c;但一…

Flink Doirs Connector 常见问题:Doris目前不支持流读

常见问题 Doris Source 在数据读取完成后&#xff0c;流为什么就结束了&#xff1f; 目前 Doris Source 是有界流&#xff0c;不支持 CDC 方式读取。 问题&#xff1a;对于 Flink Doris DataStream&#xff0c;Flink 想要在 流式读取 Doirs / 实时读 Doris&#xff0c;目前读…

03--KVM虚拟化

前言&#xff1a;这里开始涉及到云计算内容&#xff0c;虚拟化使云计算发展&#xff0c;云计算推动虚拟化进步&#xff0c;两者相辅相成&#xff0c;这一章总结一下kvm虚拟化的解决方案。 1、基础概念 1.1、云计算 以前要完成信息处理, 是需要在一个客观存在的计算机上完成的…

Node.js版本管理工具之NVM

目录 一、NVM介绍二、NVM的下载安装1、NVM下载2、卸载旧版Node.js3、安装 三、NVM配置及使用1、设置nvm镜像源2、安装Node.js3、卸载Node.js4、使用或切换Node.js版本5、设置全局安装路径和缓存路径 四、常用命令技术交流 博主介绍&#xff1a; 计算机科班人&#xff0c;全栈工…

卷积神经网络(一)---原理和结构

在介绍卷积神经网络之前&#xff0c;先提出三个观点&#xff0c;正是这三个观点使得卷积神经网络能够真正起作用。 1. 局部性 对于一张图片而言&#xff0c;需要检测图片中的特征来决定图片的类别&#xff0c;通常情况下这些特征都不是由整张图片决定的&#xff0c;而是由一些…

vscode 环境

这张截图显示的是在VS Code&#xff08;Visual Studio Code&#xff09;中选择Python解释器的界面。不同的Python解释器及其虚拟环境列出了可选项&#xff0c;用户可以根据需要选择合适的解释器来运行Python代码。以下是对截图中信息的详细解释&#xff1a; 解释器选择界面 当…

Chrome浏览器设置暗黑模式 - 护眼模式 - 亮度调节 - DarkReader - 地址栏和书签栏设置为黑色背景

效果图 全黑 浅灰 &#xff08;DarkReader设置开启亮色亮度-25&#xff09; 全白 前言 主要分两部分需要操作&#xff0c; 1&#xff09;地址栏和书签栏 》 需要修改浏览器的外观模式 2&#xff09;页面主体 》 需要安装darkreader插件进行设置 步骤 1&#xff09;地址栏和…

AOP面向切面编程和log4j的使用(Java版)

什么是面向切面编程 在传统的面向对象编程中&#xff0c;程序的功能被模块化成各个类和方法&#xff0c;这些类和方法分别处理特定的功能。然而&#xff0c;有些功能可能涉及到多个类、多个方法&#xff0c;例如日志记录、事务管理、性能监控等&#xff0c;这些功能可能在不同…

橙单后端项目下载编译遇到的问题与解决

今天下载orange-admin项目&#xff0c;不过下载下来运行出现一些问题。 1、涉及到XMLStreamException的几个类都出现下面的错误 The package javax.xml.stream is accessible from more than one module: <unnamed>, java.xml ctrl-shift-t 可以找到这个引入是哪些包里…

AcWing803. 区间合并

#include<climits>的作用是方便我直接使用INT_MIN,下面这个代码是二刷写的 思路是先根据 [ L , R ] i [L,R]_i [L,R]i​的L先排序&#xff0c;然后遍历vector进行区间合并。 #include<iostream> #include<vector> #include<algorithm> #include<cl…

在window将Redis注册为服务

将redis注册为系统服务&#xff0c;开启自启动 安装服务 默认注册完之后会自动启动&#xff0c;在window中的服务看一下&#xff0c;如果启动类型为自动&#xff0c;状态是自动运行则启动完成。如果是手动&#xff0c;需要右键属性调整为自动&#xff0c;在点击启动&#xff0c…