当前位置: 首页 > news >正文

Java实现拼图小游戏(5)—— 美化界面(含源码阅读)

美化界面

  • 一、前言
  • 二、添加背景图
    • 1.注意事项
    • 2.创建图片对象
    • 3.创建JLabel的对象(一个用来放图片的容器)
    • 4.调整位置
    • 5.将容器放到界面中
    • 6.优化代码
  • 三、添加边框
    • 1.查看源码
    • 2.查看API帮助文档
    • 3.查看BevelBorder方法
    • 4.阅读BevelBorder源码
  • 四、完整代码
  • 五、结语

一、前言

在了解完了三种监听事件后,接下来我们要把监听事件正式运用到到拼图小游戏中,但是在绑定监听事件以前,我们要先对这个游戏界面进行美化,让它的界面不再是光秃秃的,在实际开发过程中也不用担心图片设计的问题,一般会交给UI设计的小伙伴来完成(如果是一个人完成一个项目的话…那当我没说)话不多说,我们进入今天的主题

二、添加背景图

1.注意事项

  • 由于要添加背景图片,所以这里所有的代码都要写在 initImage() 方法内
  • 这里要注意:先加载的图片在上方,后加载的图片在下方,所以我们要把创建背景图的代码放在我们之前创建十五个小图片的代码后面,否则会出现背景图片将我们要拼的图片覆盖的情况(如下图)
    在这里插入图片描述

2.创建图片对象

如果这一步不会的话,可以看【Java实现拼图小游戏(3)—— 添加图片(含JFrame源码阅读)】回顾一下

ImageIcon bg = new ImageIcon("图片路径")

3.创建JLabel的对象(一个用来放图片的容器)

JLabel background = new JLabel(bg)

4.调整位置

这里小伙伴可以自己调整一下之前添加图片的位置和背景图片的位置,不一定要按照我的来写,之前添加的图片一定要调整使其放在背景图片内

background.setBounds(42,21,508,560);

5.将容器放到界面中

  • 注意:隐藏容器要手动获取,图片放在这个隐藏容器中,默认图片放在正中间,所以我们要取消默认设置,并以 XY 轴坐标形式来存放图片

  • 取消默认设置图片放置位置已经在initJFrame()方法中写了,所以我们不需要再写一遍

  • 手动获取隐藏容器:getContentPane()

  • 获取隐藏容器后还要再向容器内添加JLabel的对象

this.getContentPane().add(background);

6.优化代码

这里可以把2、3步的代码合在一起,如果分开写也是完全可以的

JLabel background = new JLabel(new ImageIcon("图片路径"));

三、添加边框

1.查看源码

  • 使用setBorder()来实现设置边框
  • 选中 setBorderCtrl+B跟进查看源码
    在这里插入图片描述
  • 再选中Border后跟进,发现这是一个接口
    在这里插入图片描述

2.查看API帮助文档

搜索一下Border来查看一下它有哪些实现类,这么多的实现类看的眼花缭乱,那么我们就点开来看看。哪个是我们需要的,这里我们选择 BevelBorder来实现我们添加边框的效果
在这里插入图片描述

3.查看BevelBorder方法

Modifier and TypeMethod and Description
int getBevelType()返回斜角边框的类型
Insets getBorderInsets(Component c, Insets insets)初始化参数和边界的插图插图
Color getHighlightInnerColor()返回斜角边框的内部突出显示颜色
Color getHighlightInnerColor(Component c)当渲染到指定的组件时,返回斜角边框的内部突出显示颜色
Color getHighlightOuterColor()返回斜角边框的外部突出显示颜色
Color getHighlightOuterColor(Component c)当渲染到指定的组件时,返回斜角边框的外部突出显示颜色
Color getShadowInnerColor()返回斜角边框的内部阴影颜色
Color getShadowInnerColor(Component c)当渲染到指定的组件时,返回斜角边框的内部阴影颜色
Color getShadowOuterColor()返回斜角边框的外部阴影颜色
Color getShadowOuterColor(Component c)当渲染到指定的组件时返回斜角边框的外部阴影颜色
boolean isBorderOpaque()返回是否边框是不透明的
void paintBorder(Component c, Graphics g, int x, int y, int width, int height)用指定的位置和大小绘制指定组件的边框

4.阅读BevelBorder源码

由于我们不知道括号内传递的是什么参数,所以最直接的方法就是去看源码!
我们的代码如下,但是打问号的地方我们只知道是int类型的参数,但是具体该填哪个数字我们不知道,那么就去看看源码

jLabel.setBorder(new BevelBorder(???));

选中BevelBorder后跟进查看源码
在这里插入图片描述
this关键字调用本类中的对象,那么我们 选中this后的bevelType再跟进一次
在这里插入图片描述
一共两个参数,对应效果也有体现,或许光看描述不知道哪个更好看,那么都试验一下

参数为1
在这里插入图片描述

参数为0
在这里插入图片描述
我们选择自己喜欢的就好,这里我选择了参数为0

四、完整代码

	private void initImage() {
        //添加十五张小图片
        for(int i = 0; i < 4; i++){
            for(int j = 0; j < 4; j++){
                int number = data[i][j];
                JLabel jLabel = new JLabel(new ImageIcon("F:\\IDEA\\PuzzleGame\\image\\image\\animal\\animal3\\"+ number +".jpg"));
                //设置小图片的位置及大小
                jLabel.setBounds(105 * j + 85, 105 * i + 115,105,105);
                //设置边框效果
                jLabel.setBorder(new BevelBorder(0));
                //将图片添加到界面中
                this.getContentPane().add(jLabel);
            }
        }
        
        //添加背景图片
        JLabel background = new JLabel(new ImageIcon("F:\\IDEA\\PuzzleGame\\image\\image\\background.png"));
        //设置背景图片位置及大小
        background.setBounds(42,21,508,560);
        //将背景图片添加到界面中
        this.getContentPane().add(background);
        
    }

五、结语

接下来的文章就要实现移动图片的效果了!!!也可以把之前学习的绑定监听事件运用到实际开发中,最后如果是第一次看到这篇文章的小伙伴对拼图小游戏感兴趣的话可以点击查看【拼图小游戏(Java)】专栏,跟着一起写出这个小游戏

相关文章:

  • 【MySQL从入门到精通】【高级篇】(二十五)EXPLAIN中ref、rows、filtered、Extra字段的剖析
  • C语言数组详解
  • DS | 冲刺阶段考点整理 —— 绪论、线性表、栈与队列、特殊矩阵、串
  • 实验5 循环结构
  • 【漏洞复现-Apache-目录穿越文件读取-RCE】vulfocus/apache(cve_2021_41773)
  • 基于matlab的SVM支持向量机分类仿真,核函数采用RBF函数(提供matlab仿真录像)
  • 机器学习基础:拉格朗日乘子法
  • Matlab 与 Python 基于窗函数的滤波器设计对比 之 凯瑟窗
  • java web开发(从spring boot到spring cloud)
  • 看呆了!二面高德 Java 岗,问了一堆源码,微服务,分布式,Redis,心累
  • 2022华为杯研究生数学建模竞赛B题思路解析
  • 2022华为杯研究生数学建模竞赛E题思路解析
  • 【C语言】学生考勤管理系统
  • 常用的调试技巧(如何检测bug)
  • SpringBoot二十六课大纲和目录
  • 【Amaple教程】5. 插件
  • 07.Android之多媒体问题
  • codis proxy处理流程
  • gcc介绍及安装
  • JavaScript对象详解
  • Yii源码解读-服务定位器(Service Locator)
  • 创建一个Struts2项目maven 方式
  • 基于 Babel 的 npm 包最小化设置
  • 讲清楚之javascript作用域
  • 前端知识点整理(待续)
  • 设计模式 开闭原则
  • 我的zsh配置, 2019最新方案
  • 一些基于React、Vue、Node.js、MongoDB技术栈的实践项目
  • 找一份好的前端工作,起点很重要
  • 正则表达式小结
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • zabbix3.2监控linux磁盘IO
  • 新海诚画集[秒速5センチメートル:樱花抄·春]
  • ​卜东波研究员:高观点下的少儿计算思维
  • ​软考-高级-信息系统项目管理师教程 第四版【第14章-项目沟通管理-思维导图】​
  • #Linux(make工具和makefile文件以及makefile语法)
  • #pragma once与条件编译
  • #QT(TCP网络编程-服务端)
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (17)Hive ——MR任务的map与reduce个数由什么决定?
  • (顶刊)一个基于分类代理模型的超多目标优化算法
  • (二开)Flink 修改源码拓展 SQL 语法
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot家庭财务分析系统 毕业设计641323
  • (原創) 如何讓IE7按第二次Ctrl + Tab時,回到原來的索引標籤? (Web) (IE) (OS) (Windows)...
  • (转) ns2/nam与nam实现相关的文件
  • *** 2003
  • .bat批处理(八):各种形式的变量%0、%i、%%i、var、%var%、!var!的含义和区别
  • .net mvc actionresult 返回字符串_.NET架构师知识普及
  • .NET开发人员必知的八个网站
  • .net使用excel的cells对象没有value方法——学习.net的Excel工作表问题
  • .NET微信公众号开发-2.0创建自定义菜单
  • @RequestParam详解
  • [145] 二叉树的后序遍历 js
  • [AX]AX2012 SSRS报表Drill through action