看好路径
MyActionListener
public class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
}
}
MyJFrame
public class MyJFrame extends JFrame implements ActionListener {
//创建一个按钮对象
JButton jtb1 = new JButton("戳我呀");
JButton jtb2 = new JButton("点击我呀");
public MyJFrame() {
this.setSize(603, 680);
this.setTitle("拼图单机版 v1.0");
//设置页面置顶
this.setAlwaysOnTop(true);
//设置页面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消居中放置,按照x,y轴分布
this.setLayout(null);
//设置位置和高
jtb1.setBounds(0, 0, 100, 50);
jtb1.addActionListener(this);
//设置位置和高
jtb2.setBounds(0, 0, 100, 50);
jtb2.addActionListener(this);
//这里的this时 本类对象
//给按钮添加动作监听
//jtb:组件对象,表示给哪个组件添加事件
//addActionListener: 表示给哪个组件添加监听(动作监听,鼠标左键&&空格)
//按钮添加到界面当中
this.getContentPane().add(jtb1);
this.getContentPane().add(jtb2);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//对当前被操作的那个按钮对象
//获取当前被操作的那个按钮对象
Object source = e.getSource();
if(source == jtb1){
jtb1.setSize(200,200);
}else if(source == jtb2){
Random r = new Random();
jtb2.setLocation(r.nextInt(500),r.nextInt(500));
}
}
}
MyJFrame2
public class MyJFrame2 extends JFrame implements MouseListener {
//创建一个按钮对象
JButton jtb1 = new JButton("点我呀");
public MyJFrame2(){
this.setSize(603, 680);
this.setTitle("拼图单机版 v1.0");
//设置页面置顶
this.setAlwaysOnTop(true);
//设置页面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消居中放置,按照x,y轴分布
this.setLayout(null);
//给按钮设置位置和宽高
jtb1.setBounds(0,0,100,50);
//给按钮绑定事件
jtb1.addMouseListener(this);
//本类对象this
//按钮添加到界面内
this.getContentPane().add(jtb1);
//界面显示
this.setVisible(true);
}
@Override
public void mouseClicked(MouseEvent e) {
System.out.println("单击");
}
@Override
public void mousePressed(MouseEvent e) {
System.out.println("按下不松");
}
@Override
public void mouseReleased(MouseEvent e) {
System.out.println("松开");
}
@Override
public void mouseEntered(MouseEvent e) {
System.out.println("松开");
}
@Override
public void mouseExited(MouseEvent e) {
System.out.println("滑出");
}
}
MyJFrame3
public class MyJFrame3 extends JFrame implements KeyListener {
public MyJFrame3() {
this.setSize(603, 680);
this.setTitle("拼图单机版 v1.0");
//设置页面置顶
this.setAlwaysOnTop(true);
//设置页面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//取消居中放置,按照x,y轴分布
this.setLayout(null);
//给整个窗体添加键盘监听
//参数this,当事件被触发后,执行本类中对应的代码
this.addKeyListener(this);
this.setVisible(true);
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
System.out.println("按下不松");
}
@Override
public void keyReleased(KeyEvent e) {
System.out.println("松开按键");
int code = e.getKeyCode();
if(code == 65){
System.out.println("现在按住的是A");
}else if(code == 66){
System.out.println("现在按住的是B");
}
}
}
Test1
public class Test1{
public static void main(String[] args){
//需求:
//打乱数据0~9,三个一组加到二维数组中
//定义一个一维数组
int[] tempArr = {0,1,2,3,4,5,6,7,8};
//打乱数组中的数据
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;
}
//遍历数组
for (int i = 0; i < tempArr.length; i++) {
System.out.println(tempArr[i] + " ");
}
System.out.println();
//创建二维数组
int[][] data = new int[3][3];
//方法二:遍历二维数组
int index = 0;
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
data[i][j] = tempArr[index];
index++;
}
}
//遍历二维数组
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.println(data[i][j] + " ");
}
System.out.println();
}
}
}
Test2
public class Test2 {
public static void main(String[] args){
JFrame jFrame = new JFrame();
//涉恶之界面的宽高
jFrame.setSize(603,680);
//设置界面的标题
jFrame.setTitle("事件演示");
//设置页面置顶
jFrame.setAlwaysOnTop(true);
//设置页面居中
jFrame.setLocationRelativeTo(null);
//设置关闭模式
jFrame.setDefaultCloseOperation(3);
//取消居中放置,按照x,y轴分布
jFrame.setLayout(null);
//创建一个按钮对象
JButton jtb = new JButton("戳我呀");
//设置位置和高
jtb.setBounds(0,0,100,50);
//给按钮添加动作监听
//jtb:组件对象,表示给哪个组件添加事件
//addActionListener: 表示给哪个组件添加监听(动作监听,鼠标左键&&空格)
jtb.addActionListener(new MyActionListener());
jtb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("不要点击我呀~");
}
});
//把按钮添加到界面中
jFrame.getContentPane().add(jtb);
jFrame.setVisible(true);
}
}
Test3
public class Test3 {
public static void main(String[] args){
new MyJFrame2();
}
}
Test4
public class Test4 {
public static void main(String[] args){
new MyJFrame3();
}
}
GameJFrame
public class GameJFrame extends JFrame implements KeyListener, ActionListener {
//游戏的主界面
//创建二维数组
//目的:用来管理数据
//加载图片时,会根据二维数组中的数据进行加载
int[][] data = new int[4][4];
//记录空白方块在二维数组中的位置
int x = 0;
int y = 0;
//定义一个变量,记录当前展示图片的路径
String path = "src\\com\\yst\\ui\\image\\";
//定义一个二维数组,储存正确的数据
int[][] win = {
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
//定义变量统计步数
int step = 0;
//创建选项下面的条目对象
JMenuItem replayItem = new JMenuItem("重新开始");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
public GameJFrame(){
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数据(打乱)
initData();
//初始化图片
initImage();
//让显示出来
this.setVisible(true);
}
private void initData(){
//定义一个一维数组
int[] tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
//打乱数组中的数据
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;
}
for(int i = 0; i< tempArr.length; i++ ){
if(tempArr[i] == 0){
x = i / 4;
y = i % 4;
}
data[i/4][i % 4] = tempArr[i];
}
// //方法二:遍历二维数组
// int index = 0;
// for (int i = 0; i < data.length; i++) {
// for (int j = 0; j < data[i].length; j++) {
// data[i][j] = tempArr[index];
// index++;
// }
// }
// //遍历二维数组
// for (int i = 0; i < data.length; i++) {
// for (int j = 0; j < data[i].length; j++) {
// System.out.println(data[i][j] + " ");
// }
// System.out.println();
// }
}
//初始化图片
private void initImage(){
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
if(victory()){
//显示胜利图标
JLabel winJLabel = new JLabel(new ImageIcon(path + "19.png"));
winJLabel.setBounds(203,283,197,73);
this.getContentPane().add(winJLabel);
}
JLabel stepCount = new JLabel("步数:" + step);
stepCount.setBounds(50,30,100,20);
this.getContentPane().add(stepCount);
//细节
//先加载的图片在上方
//外循环表示内循环纪念性4次
for (int i = 0; i < 4; i++) {
//内循环表示一行加载4张图片
for (int j = 0; j < 4; j++) {
//获取当前要加载的图片序号
int num = data[i][j];
//创建一个图片ImageIcon的对象
JLabel jLabel = new JLabel(new ImageIcon(path +num+".png"));
//指定图片位置
jLabel.setBounds(210*j + 83,210*i + 134,210,210);
//给图片设置边框
//1:图片凹陷
//2:图片突起
jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
// 把管理容器添加到界面
this.getContentPane().add(jLabel);
}
}
//添加背景图片
JLabel background = new JLabel(new ImageIcon(path + "18.png"));
background.setBounds(40,40,900,900);
//添加到界面中
this.getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
}
private void initJMenuBar() {
//初始化菜单
//创建整个菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上面的两个对象
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
// 将每一个选项下面的条目添加到选项当中
functionJMenu.add(replayItem);
functionJMenu.add(reLoginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//给条目绑定监听事件
replayItem.addActionListener(this);
reLoginItem.addActionListener(this);
closeItem.addActionListener(this);
accountItem.addActionListener(this);
//将菜单里面的两个选项添加到菜单
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
private void initJFrame() {
this.setSize(1000,1000);
//设置界面标题
this.setTitle("拼图单机版 v1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消默认的居中放置,只有取消了才会按照x,y轴添加组件
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
@Override
public void keyTyped(KeyEvent e) {
}
//按住不松时调用这个方法
@Override
public void keyPressed(KeyEvent e) {
int code = e.getKeyCode();
if(code == 65){
//界面中的所有图片全部删除
this.getContentPane().removeAll();
//加载第一张完整图片
JLabel all = new JLabel(new ImageIcon(path + "21.png"));
all.setBounds(83,50,820,820);
this.getContentPane().add(all);
//加载背景图片
//添加背景图片
JLabel background = new JLabel(new ImageIcon(path + "10.png"));
background.setBounds(40,40,913,769);
//添加到界面中
this.getContentPane().add(background);
//刷新界面
this.getContentPane().repaint();
}
}
//松开按键时调用此方法
@Override
public void keyReleased(KeyEvent e) {
//如果游戏胜利,直接结束游戏不再进行
if(victory()){
//结束方法
return;
}
int code = e.getKeyCode();
System.out.println(code);
if(code == 37){
System.out.println("向左移动");
if(y == 3){
return;
}
data[x][y] = data[x][y+1];
data[x][y+1] = 0;
y++;
//每移动一次,计数器自增一次
step++;
//调用方法加载图片
initImage();
} else if (code == 38) {
System.out.println("向上移动");
if(x == 3){
return;
}
data[x][y] = data[x+1][y];
data[x+1][y] = 0;
x++;
//每移动一次,计数器自增一次
step++;
//调用方法加载图片
initImage();
} else if (code == 39) {
System.out.println("向右移动");
if(y == 0){
return;
}
data[x][y] = data[x][y-1];
data[x][y-1] = 0;
y--;
//每移动一次,计数器自增一次
step++;
//调用方法加载图片
initImage();
}else if (code == 40) {
System.out.println("向下移动");
if(x == 0){
return;
}
data[x][y] = data[x-1][y];
data[x-1][y] = 0;
x--;
//每移动一次,计数器自增一次
step++;
//调用方法按照最新数字加载图片
initImage();
} else if (code == 65) {
initImage();
} else if (code == 87){
{
data = new int[][]{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
{13,14,15,0}
};
initImage();
}
}
}
public boolean victory(){
for(int i = 0; i < data.length; i++){
//i: 一次表示二维数组data里面的索引
//data[i]: 依次表示每一个一维数组
for(int j = 0; j < data[i].length; j++){
if(data[i][j] != win[i][j]){
return false;
}
}
}
return true;
}
@Override
public void actionPerformed(ActionEvent e) {
//获取当前被点击的条目对象
Object obj = e.getSource();
//判断
if(obj == replayItem){
System.out.println("重新游戏");
//计步器清零
step = 0;
//再次打乱二维数组中的数据
initData();
//重新加载图片
initImage();
} else if (obj == reLoginItem) {
System.out.println("重新登陆");
//关闭当前的游戏界面
this.setVisible(false);
//打开游戏的登陆界面
new LoginJFrame();
} else if (obj == closeItem) {
System.out.println("关闭游戏");
//直接关闭虚拟机
System.exit(0);
} else if (obj == accountItem) {
System.out.println("公众号");
//创建一个弹窗对象
JDialog jDialog = new JDialog();
JLabel jLabel = new JLabel(new ImageIcon("src\\com\\yst\\ui\\image\\20.png"));
//宽高是相对于弹窗而言的
jLabel.setBounds(0,0,172,172);
//把图片添加到弹窗中
jDialog.getContentPane().add(jLabel);
//给弹窗设置大小
jDialog.setSize(344,344);
//弹窗置顶
jDialog.setAlwaysOnTop(true);
//弹框居中
jDialog.setLocationRelativeTo(null);
//弹窗不关闭则无法进行下面操作的界面
jDialog.setModal(true);
//让弹框显示出来
jDialog.setVisible(true);
}
}
}
LoginJFrame
public class LoginJFrame extends JFrame {
public LoginJFrame(){
//在创建登陆界面时,同时设置一些信息
this.setSize(488,430);
//设置界面标题
this.setTitle("拼图 登录");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//让显示出来
this.setVisible(true);
}
}
RegisterJFrame
public class RegisterJFrame extends JFrame {
public RegisterJFrame(){
this.setSize(488,500);
//设置界面标题
this.setTitle("拼图 注册");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(3);
//让显示出来
this.setVisible(true);
}
}
App
public class App {
public static void main(String[] args){
//表示程序的启动入口
//如果想开启一个界面,就创建谁的对象就可以
// new LoginJFrame();
//
// new RegisterJFrame();
new GameJFrame();
}
}
图片有21张,注意相对地址和大小,有作弊码和快捷键