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

简介: 先加载的图片在上方,后加载的图片在下方,所以我们要把创建背景图的代码放在我们之前创建十五个小图片的代码后面,否则会出现背景图片将我们要拼的图片覆盖的情况

一、前言


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


二、添加背景图


1.注意事项


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


552ff8064c1e4b1caafeeb94f4372dcf.png


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()来实现设置边框
  • 选中 setBorder 后 Ctrl+B跟进查看源码


5fd6e8fb0ce7452faad9c17b78b80556.png


  • 再选中Border后跟进,发现这是一个接口


20f4ce1f3e99436687d29ae551163afe.png


2.查看API帮助文档


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


25ebec17a0b143d6a9a6f7989df0ffeb.png


3.查看BevelBorder方法


Modifier and Type Method 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后跟进查看源码


c2935f1c0148497d98e1fdb544417bb9.png


this关键字调用本类中的对象,那么我们 选中this后的bevelType再跟进一次


e199733253314f7aba501899043c9aa0.png


一共两个参数,对应效果也有体现,或许光看描述不知道哪个更好看,那么都试验一下


参数为1


397a4a4bc9134103886c7514f4dd1917.png


参数为0


108d87dbfa03440e9011c6e6917cd324.png


我们选择自己喜欢的就好,这里我选择了参数为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)】专栏,跟着一起写出这个小游戏

相关文章
|
4天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
16 2
|
8天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
25 3
|
13天前
|
运维 自然语言处理 供应链
Java云HIS医院管理系统源码 病案管理、医保业务、门诊、住院、电子病历编辑器
通过门诊的申请,或者直接住院登记,通过”护士工作站“分配患者,完成后,进入医生患者列表,医生对应开具”长期医嘱“和”临时医嘱“,并在电子病历中,记录病情。病人出院时,停止长期医嘱,开具出院医嘱。进入出院审核,审核医嘱与住院通过后,病人结清缴费,完成出院。
45 3
|
21天前
|
开发框架 JavaScript 前端开发
HarmonyOS UI开发:掌握ArkUI(包括Java UI和JS UI)进行界面开发
【10月更文挑战第22天】随着科技发展,操作系统呈现多元化趋势。华为推出的HarmonyOS以其全场景、多设备特性备受关注。本文介绍HarmonyOS的UI开发框架ArkUI,探讨Java UI和JS UI两种开发方式。Java UI适合复杂界面开发,性能较高;JS UI适合快速开发简单界面,跨平台性好。掌握ArkUI可高效打造符合用户需求的界面。
74 8
|
19天前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
22天前
|
移动开发 前端开发 JavaScript
java家政系统成品源码的关键特点和技术应用
家政系统成品源码是已开发完成的家政服务管理软件,支持用户注册、登录、管理个人资料,家政人员信息管理,服务项目分类,订单与预约管理,支付集成,评价与反馈,地图定位等功能。适用于各种规模的家政服务公司,采用uniapp、SpringBoot、MySQL等技术栈,确保高效管理和优质用户体验。
|
9天前
|
安全 Java 测试技术
Java并行流陷阱:为什么指定线程池可能是个坏主意
本文探讨了Java并行流的使用陷阱,尤其是指定线程池的问题。文章分析了并行流的设计思想,指出了指定线程池的弊端,并提供了使用CompletableFuture等替代方案。同时,介绍了Parallel Collector库在处理阻塞任务时的优势和特点。
|
5天前
|
安全 Java 开发者
深入解读JAVA多线程:wait()、notify()、notifyAll()的奥秘
在Java多线程编程中,`wait()`、`notify()`和`notifyAll()`方法是实现线程间通信和同步的关键机制。这些方法定义在`java.lang.Object`类中,每个Java对象都可以作为线程间通信的媒介。本文将详细解析这三个方法的使用方法和最佳实践,帮助开发者更高效地进行多线程编程。 示例代码展示了如何在同步方法中使用这些方法,确保线程安全和高效的通信。
25 9
|
8天前
|
存储 安全 Java
Java多线程编程的艺术:从基础到实践####
本文深入探讨了Java多线程编程的核心概念、应用场景及其实现方式,旨在帮助开发者理解并掌握多线程编程的基本技能。文章首先概述了多线程的重要性和常见挑战,随后详细介绍了Java中创建和管理线程的两种主要方式:继承Thread类与实现Runnable接口。通过实例代码,本文展示了如何正确启动、运行及同步线程,以及如何处理线程间的通信与协作问题。最后,文章总结了多线程编程的最佳实践,为读者在实际项目中应用多线程技术提供了宝贵的参考。 ####