拼图游戏(上)
阶段小项目(上)
主界面搭建
知识了解:JFrame属于一个类,专门用于做窗体的
使用的时候,就需要导包使用
package ui;
import javax.swing.*;
public class Test {
public static void main(String[] args) {
//1.创建游戏主界面
JFrame gameJFrame=new JFrame();
gameJFrame.setSize(603,680);
gameJFrame.setVisible(true);
//2.创建登陆界面
JFrame loginJFrame=new JFrame();
loginJFrame.setSize(488,430);
loginJFrame.setVisible(true);
//3.创建注册界面
JFrame registerJFrame=new JFrame();
registerJFrame.setSize(488,500);
registerJFrame.setVisible(true);
}
}
由于以上属于测试代码,一般程序的主入口一般不写东西,只需要启动程序使用
import ui.GameJFrame;
import ui.LoginJFrame;
import ui.RegisterJFrame;
public class App {
public static void main(String[] args) {
//表示程序的入口
//如果我们想开启一个界面,就创建谁的对象就可以了
new LoginJFrame();
new GameJFrame();
new RegisterJFrame();
}
}
package ui;
import javax.swing.*;
public class GameJFrame extends JFrame {
//JFrame 界面,窗体
//子类GameJFrame,就是也是窗体
//规则:GameJFrame代表的是游戏的主界面
//以后跟游戏相关的所有逻辑都写在这个类中
public GameJFrame(){
this.setSize(603,680);
this.setVisible(true);
}
}
package ui;
import javax.swing.*;
public class LoginJFrame extends JFrame {
//JFrame 界面,窗体
//规则:LoginJFrame代表的是
//登陆的主界面,以后跟登陆的所有逻辑都写在这个类中
//书写构造方法
public LoginJFrame(){
//在创建登陆界面的时候,同时给这个界面去设置一些信息
//比如:宽高,展示
this.setSize(488,430);
this.setVisible(true);
}
}
package ui;
import javax.swing.*;
public class RegisterJFrame extends JFrame {
//JFrame 界面,窗体
//规则:RegisterJFrame代表的是
//注册的主界面,以后跟注册的所有逻辑都写在这个类中
public RegisterJFrame(){
this.setSize(488,500);
this.setVisible(true);
}
}
这时候就可以删除掉Test类了
界面设置
package ui;
import javax.swing.*;
public class LoginJFrame extends JFrame {
//JFrame 界面,窗体
//规则:LoginJFrame代表的是
//登陆的主界面,以后跟登陆的所有逻辑都写在这个类中
//书写构造方法
public LoginJFrame(){
//在创建登陆界面的时候,同时给这个界面去设置一些信息
//比如:宽高,展示
this.setSize(488,430);
//设置界面的标题
this.setTitle("拼图游戏 登录");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
this.setVisible(true);
}
}
package ui;
import javax.swing.*;
public class GameJFrame extends JFrame {
//JFrame 界面,窗体
//子类GameJFrame,就是也是窗体
//规则:GameJFrame代表的是游戏的主界面
//以后跟游戏相关的所有逻辑都写在这个类中
public GameJFrame(){
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题
this.setTitle("拼图游戏单机版 V1.0.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//显示界面,写在最后
this.setVisible(true);
}
}
import javax.swing.*;
public class RegisterJFrame extends JFrame {
//JFrame 界面,窗体
//规则:RegisterJFrame代表的是
//注册的主界面,以后跟注册的所有逻辑都写在这个类中
public RegisterJFrame(){
this.setSize(488,500);
//设置界面的标题
this.setTitle("拼图游戏 注册");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
this.setVisible(true);
}
}
菜单搭建
把初始化界面和初始化菜单可以用方法包裹,便于日后维护
import javax.swing.*;
public class GameJFrame extends JFrame {
//JFrame 界面,窗体
//子类GameJFrame,就是也是窗体
//规则:GameJFrame代表的是游戏的主界面
//以后跟游戏相关的所有逻辑都写在这个类中
public GameJFrame(){
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//显示界面,写在最后
this.setVisible(true);
}
private void initJMenuBar() {
//创建整个菜单的对象
JMenuBar jMenuBar=new JMenuBar();
//创建菜单上面的两个选项的对象(功能 关于我们)
JMenu functionJmenu=new JMenu("功能");
JMenu aboutJmenu=new JMenu("关于我们");
//创建选项下面的选项卡
JMenuItem repalyItem=new JMenuItem("重新游戏");
JMenuItem reLoginItem=new JMenuItem("重新登录");
JMenuItem closeItem=new JMenuItem("关闭游戏");
JMenuItem weiChatItem=new JMenuItem("微信号");
//将选项卡添加到菜单中
//添加到功能
functionJmenu.add(repalyItem);
functionJmenu.add(reLoginItem);
functionJmenu.add(closeItem);
//添加到关于我们
aboutJmenu.add(weiChatItem);
//添加到菜单
jMenuBar.add(functionJmenu);
jMenuBar.add(aboutJmenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
private void initJFrame() {
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题
this.setTitle("拼图游戏单机版 V1.0.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
}
}
添加图片
初始化图片的代码用方法写了
//初始化图片
private void initImage() {
int number=1;
//以4×4的方式加载图片
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
/*创建一个图片ImageIcon对象
ImageIcon icon=new ImageIcon("Jigsawgame\\素材\\image\\animal\\animal3\\1.jpg");*/
//创建一个JLable的对象 (管理容器)
JLabel jLabel=new JLabel(new ImageIcon("Jigsawgame\\素材\\image\\animal\\animal3\\"+number+".jpg"));
//指定一下图片的位置
jLabel.setBounds(105* j,105*i,105,105);
//把管理容器添加到界面中
//this.add(jLabel);
this.getContentPane().add(jLabel);
number++;
}
}
}
打乱图片
根据这个Test知道如何将二维数组数据进行打乱
import java.util.Random;
public class Test {
public static void main(String[] args) {
//打乱一维数组中的数据,并且存放到二维数组中
//1.定义一维数组
int[] tempArr={0,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 < tempArr.length; i++) {
int index=r.nextInt(tempArr.length);
int temp=tempArr[i];
tempArr[i]=tempArr[index];
tempArr[index]=temp;
}
//3.创建二维数组
int [][] data=new int[4][4];
//4.将打乱后的一维数组依次存入二维数组中,有两种方法
//method1
//将一维数组进行遍历,然后一个一个存入
for (int i = 0; i < tempArr.length; i++) {
data[i/4][i%4]=tempArr[i];
}
//method2
//将二维数组遍历,再依次存入一维数组的元素
/*int index=0;
for (int i = 0; i <4; i++) {
for (int j = 0; j <4 ; j++) {
data[i][j]=tempArr[index];
index++;
}
}*/
//遍历一下一维数组
for (int i = 0; i < tempArr.length; i++) {
System.out.print(tempArr[i]+" ");
}
System.out.println();
//遍历一下二维数组
for (int i = 0; i <4; i++) {
for (int j = 0; j <4 ; j++) {
System.out.print(data[i][j]+" ");
}
System.out.println();
}
}
}
事件
-
事件就是可以被组件识别的操作
-
当你对组件干了某件事情之后,就会执行相应的代码
-
时间源:按钮 图片 窗体
-
事件:某些操作
例如:鼠标单击,鼠标划入
-
绑定监听:当事件源上发生了某个事件,则执行某段代码
键盘监听 KeyListener 鼠标监听:MouseListener 动作监听:ActionListener
动作监听:只能识别鼠标单击和空格的事件
鼠标监听
所有方法 | 接口方法 | 抽象方法 |
---|---|---|
Modifier and Type | 方法 | 描述 |
void | mouseClicked(Mouse Event e) | 在组件上单击(按下并释放)鼠标按钮时调用 |
void | mouseEnter(Mouse Event e) | 当鼠标进入组件时调用 |
void | mouseExisted(Mouse Event e) | 当鼠标退出组件时调用 |
void | mousePressed(Mouse Event e) | 当鼠标按下组件时调用(按下不松) |
void | mouseReleased(Mouse Event e) | 当鼠标在组件上释放时调用 |
键盘监听:
所有方法 | 接口方法 | 抽象方法 |
---|---|---|
Modifier and Type | 方法 | 描述 |
void | keyPressed(KeyEvent e) | 按下时调用 |
void | keyReleased(KeyEvent e) | 当键已被释放时调用 |
void | keyTyped(KeyEvent e) | 键入键时调用 |