未完成项目…一直没空写
1. 创建主界面
2. 菜单制作
3. 添加图片
JLabel管理区域:文字、图片
管理图片时,可以对图片的边框、宽高、位置进行设置
步骤:
- 先创建一个ImageIcon对象,并指定图片的位置
- 再创建一个JLabel对象,把图片交给JLabel
- 再把这个整体放到界面当中
4. 事件
事件源:按钮、图片、窗体
事件:某些操作,如:鼠标单击、鼠标划入
绑定事件:当事件源上发生了某个事件,则执行某段代码
例如:点击“登录”按钮会,会发生校验用户名和密码的事件
分类:键盘监听KeyListener、鼠标监听MouseListener、动作监听ActionListener
鼠标监听
public class MouseLis extends JFrame implements MouseListener {
//创建一个按钮对象
JButton jbt1 = new JButton("按钮1");
public MouseLis(){
this.setSize(603, 680);
this.setTitle("测试鼠标点击事件");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setLayout(null);
jbt1.setBounds(0, 0, 100, 50);
//给按钮绑定鼠标事件
jbt1.addMouseListener(this);
this.getContentPane().add((jbt1));
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("鼠标划出");
}
}
键盘监听
public class KeyLis extends JFrame implements KeyListener {
public KeyLis(){
this.setSize(603,680);
this.setTitle("测试鼠标点击事件");
this.setAlwaysOnTop(true);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
this.setLayout(null);
//给整个窗体添加键盘监听
//调用者this:本类对象,当前的界面对象,表示我要给整个界面添加监听
//addKeyListener: 表示要给本界面键盘监听
//参数this:当事件被触发之后,会执行本类中的对应代码
this.addKeyListener(this);
this.setVisible(true);
}
@Override
public void keyTyped(KeyEvent e) {
}
//细节1:如果按下一个按键没有松开,那么会重复的去调用keyPressed方法
//细节2:键盘里那么多按键,如何进行区分?
//每一个按键都有一个编号与之对应
@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");
}
}
}
5. 美化界面
6. 向上移动
上移:把空白方块下方的图片上移
7. 看完整图片
按住A,显示完整图片
松开A,显示打乱图片
代码
app.java
public class App {
public static void main(String[] args) {
//App表示程序的启动入口
//如果我们想要开启一个界面,就创建谁的对象就可以了
new LoginJFrame();//创造了一个界面
new GameJFrame();
new RegisterJFrame();
}
}
package com.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
public class GameJFrame extends JFrame implements KeyListener {
//创建一个二维数组,目的:用来管理数据
//加载图片的时候,会根据二维数组
//写在方法外面,是因为在initData()和initImage()中都会用到
int[][] data = new int[4][4];
//记录空白方块在二维数组中的位置
int x = 0;
int y = 0;
//定义一个变量,记录当前展示图片的路径
String path = "image/touxiang/";
//JFrame表示:界面、窗体,那么子类也表示界面、窗体
//这个界面是游戏的主界面
//以后跟登录界面相关的所有代码,都写在这里
public GameJFrame()
{
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//初始化数据(打乱)
initData();
//初始化图片(根据打乱后的 结果/二维数组 加载图片)
initImage();
//让界面显示
this.setVisible(true);
}
//数据打乱
private void initData() {
//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;
}
for (int i = 0; i < tempArr.length; i++) {
if(tempArr[i] == 0){
x = i/4;
y = i%4;
} else {
data[i/4][i%4] = tempArr[i];
}
}
}
//初始化图片
//添加图片的时候,按照二维数组中管理的数据添加图片
private void initImage() {
//清空原本已经出现的所有图片
this.getContentPane().removeAll();
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
int num = data[i][j];
//获取当前要加载图片的序号
//创建一个图片ImageIcon的对象
//创建一个JLabel的对象(管理容器),将ImageIcon放入JLabel中
JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
//指定图片的位置
jLabel.setBounds(105 * i + 83, 105 * j + 104, 105, 105);
//给图片添加边框
//RAISED: 表示让图片凸起来,LOWERED:表示让图片凹下去
jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
//把管理容器添加到界面
this.getContentPane().add(jLabel);
}
}
//添加背景图片
JLabel jLabel = new JLabel(new ImageIcon("image/background/0.jpeg"));
jLabel.setBounds(40,40,508,560);
//把背景图片添加到界面当中
this.getContentPane().add(jLabel);
//刷新一下界面
this.getContentPane().repaint();
}
private void initJFrame(){
//设置界面的宽高
this.setSize(603,680);
//设置界面的标题标题
this.setTitle("拼图");
//设置界面置顶(该界面在最上方,会盖住其他界面,如一直盖住idea)
this.setAlwaysOnTop(true);
//设置界面打开时居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//取消默认的居中方式
this.setLayout(null);
//给整个界面添加键盘监听事件
this.addKeyListener(this);
}
//在游戏窗口的上方添加菜单
private void initJMenuBar(){
//初始化菜单
//创建整个的菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上面的两个选项的对象(功能、关于我们)
JMenu funtionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//创建选项下面的条目对象
JMenuItem replyItem = new JMenuItem("重新游戏");
JMenuItem reLoginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//将每一个选项下面的条目添加到选项中
funtionJMenu.add(replyItem);
funtionJMenu.add(reLoginItem);
funtionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//将菜单里的两个选项加入到菜单中
jMenuBar.add(funtionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
@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("image/background/1.jpeg"));
all.setBounds(83,134,420,420);
this.getContentPane().add(all);
//加载背景图片
JLabel bg = new JLabel(new ImageIcon("image/background/2.jpeg"));
bg.setBounds(40,40,508,560);
this.getContentPane().add(bg);
//刷新界面
this.getContentPane().repaint();
}
}
@Override
public void keyReleased(KeyEvent e) {
//对左(37)、上(38)、右(39)、下(40)进行判断
int code = e.getKeyCode();
if(code == 37){
if(x == 0){
return;
}
System.out.println("向左移动");
data[x][y] = data[x-1][y];
data[x-1][y] = 0;
x--;
initImage();
} else if (code == 38) {
if(y == 0){
return;
}
System.out.println("向上移动");
//x, y空白方块,x+1, y空白方块下方的数字
data[x][y] = data[x][y-1];
data[x][y-1] = 0;
y--;
//调用方法按照最新的数字加载图片
initImage();
} else if (code == 39) {
if(x == 3){
return;
}
System.out.println("向右移动");
data[x][y] = data[x+1][y];
data[x+1][y] = 0;
x++;
initImage();
} else if (code == 40) {
if(y == 3){
return;
}
System.out.println("向下移动");
data[x][y] = data[x][y+1];
data[x][y+1] = 0;
y++;
initImage();
} else if (code == 65) {
initImage();
}
}
}
public class LoginJFrame extends JFrame {
//LoginJFrame 表示登录界面
//以后所有跟登录相关的代码,都写在这里
//写一个构造方法,创造界面时,给界面进行初始化
//在创建登录界面的时候,同时给这个界面去设置一些信息
//比如,宽高、展示...
public LoginJFrame(){
//this表示的是在App.java的主函数中创建的对象,给那个对象设置宽高...
this.setSize(488, 430);
//设置界面的标题标题
this.setTitle("登录界面");
//设置界面置顶(该界面在最上方,会盖住其他界面,如一直盖住idea)
this.setAlwaysOnTop(true);
//设置界面打开时居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//让界面显示
this.setVisible(true);
}
}
public class RegisterJFrame extends JFrame {
//跟注册相关的代码都写在这里
public RegisterJFrame()
{
this.setSize(488, 500);
//设置界面的标题标题
this.setTitle("注册界面");
//设置界面置顶(该界面在最上方,会盖住其他界面,如一直盖住idea)
this.setAlwaysOnTop(true);
//设置界面打开时居中
this.setLocationRelativeTo(null);
//设置关闭模式
this.setDefaultCloseOperation(EXIT_ON_CLOSE);
//让界面显示
this.setVisible(true);
}
}