三. 添加图片
涉及知识 : Imagelcon类,JLable类,一维数组,Random类,二维数组
-
ImageIcon类: ImageIcon类是Java中用于表示图像图标的类。它继承自Icon接口,并提供了一些与图像相关的方法,如获取图标的宽度和高度、获取图标的Image对象等。ImageIcon类通常用于Swing和AWT界面中,用于为按钮、标签等组件设置图标。
-
JLabel类: JLabel类是Java中用于显示文本或图像的标签组件。它继承自JComponent类,并提供了一些用于设置和操作标签内容的方法,如设置文本、设置图标、设置字体等。JLabel类通常用于Swing和AWT界面中,用于显示静态文本或图像。
-
一维数组: 一维数组是Java中的一种数据结构,用于存储一组具有相同数据类型的元素。一维数组可以存储基本类型数据(如int、float等)或对象类型数据(如String、Person等),并且可以通过索引访问和修改数组元素。在Java中,一维数组的长度是固定的,即在创建数组时需要指定数组的长度。
-
Random类: Random类是Java中用于生成随机数的类。它提供了多种方法用于生成不同类型的随机数,如生成整数随机数、生成浮点数随机数等。Random类使用伪随机数生成算法,根据种子值生成随机数序列。可以通过调用Random类的方法来获取不同范围的随机数。
-
二维数组: 二维数组是Java中的一种数据结构,用于表示具有二维结构的数据。二维数组实际上是由多个一维数组组成的,每个一维数组称为二维数组的行,而所有行组成了二维数组的列。二维数组可以存储基本类型数据或对象类型数据,并且可以通过行和列的索引访问和修改数组元素。在Java中,二维数组的行数和列数都是固定的,在创建数组时需要指定行数和列数。
在游戏中拼图由一整张图片分成大小相等的若干部分,打乱,复原;
一个部分也就是一张小图片,对应Imagelcon类对象,创建Imagelcon对象,再创建JLable对象对图片进行基本设置。
先将已经制作好的素材包添加到项目名下
在这里image是素材包
初始化一张图片
private void initImage() { //创建一个图片ImageIcon的对象 ImageIcon icon = new ImageIcon("E:\\Ideal Code Exercise\\puzzllegame\\image\\animal\\animal3\\3.jpg"); //创建一个JLable的对象(管理容器) JLabel jLabel = new JLabel(icon); //把管理容器添加到界面中 this.add(jLabel); }
创建一个图片ImageIcon的对象
image -->animal --> animal3 --> 3.jpg --> 右键 -->点击Copy Path/Reference --> 点击Absolute Path --> ctrl + v 复制到 ImageIcon icon = new ImageIcon(这里);
将一张图片分为15张(105,105)像素的小图片,以循环的模式将其添加到界面中
//初始化图片
private void initImage() {
int num = 1;
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
//创建一个图片ImageIcon的对象
ImageIcon icon = new ImageIcon("E:\\Ideal Code Exercise\\puzzllegame\\image\\animal\\animal3\\"+num+".jpg");
//创建一个JLable的对象(管理容器)
JLabel jLabel = new JLabel(icon);
//指定图片位置
jLabel.setBounds(105 * j, 105 * i, 105, 105);
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
num++;
}
}
}
这时运行的结果为一张有序图片,因此可以利用一维数组,Random类,二维数组
结合利用将其图片顺序打乱
细节:
在素材包内图片编码从一开始,因此一维数组元素从一开始,避免运行结果在末尾有不规则图片;
最后一张图找不到素材,自动添加为空白图片
"+num+" : 地址拼接,注意各个符号之间不要有空格
实现如下:
private void initData() { //1.定义一个一维数组 int[] temArr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15}; //2.打乱数组中的数据的顺序 //遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换 Random r = new Random(); for (int i = 0; i < temArr.length; i++) { //获取随机索引 int index = r.nextInt(temArr.length); //拿着历遍到的每一个数据,跟随机索引上的数据进行交换 int temp = temArr[i]; temArr[i] = temArr[index]; temArr[index] = temp; } //3.创建一个二维数组(全局变量) // int[][] data = new int[4][4]; //4.给二维数组添加数组 for (int i = 0; i < temArr.length; i++) { data[i / 4][i % 4] = temArr[i]; } }
代码实现:
// 创建一个二维数组
int[][] data = new int[4][4];
//1.创建一个游戏的主界面
//跟游戏相关的所有逻辑写在这个类中
public GameJFrame(){
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数据(打乱)
initData();
//初始化图片
initImage();
//让显示出来,建议写在最后
this.setVisible(true);
}
private void initData() {
//1.定义一个一维数组
int[] temArr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//2.打乱数组中的数据的顺序
//遍历数组,得到每一个元素,拿着每一个元素跟随机索引上的数据进行交换
Random r = new Random();
for (int i = 0; i < temArr.length; i++) {
//获取随机索引
int index = r.nextInt(temArr.length);
//拿着历遍到的每一个数据,跟随机索引上的数据进行交换
int temp = temArr[i];
temArr[i] = temArr[index];
temArr[index] = temp;
}
//3.创建一个二维数组(全局变量)
// int[][] data = new int[4][4];
//4.给二维数组添加数组
for (int i = 0; i < temArr.length; i++) {
data[i / 4][i % 4] = temArr[i];
}
}
//初始化图片
private void initImage() {
for(int i = 0; i < 4; i++){
for(int j = 0; j < 4; j++){
int num = data[i][j];
//创建一个图片ImageIcon的对象
ImageIcon icon = new ImageIcon("E:\\Ideal Code Exercise\\puzzllegame\\image\\animal\\animal3\\"+num+".jpg");
//创建一个JLable的对象(管理容器)
JLabel jLabel = new JLabel(icon);
//指定图片位置
jLabel.setBounds(105 * j, 105 * i, 105, 105);
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
}
运行结果:
隐藏容器 :装载所有的组件
窗体 通过getContenPane() 获取,把要显示东西给它,没有特殊要求,默认放中间
取消默认的剧中放置,只有取消了才会按照XY轴的方式添加组件
public void setLayout( java.awt.LayoutManager manager )
隐藏容器(不需要创建,在底层以有实现方法)在idea中 选中方法 快捷键 ctrl + b;