一、创建界面:
创建一个603×680像素大小的游戏主界面。
创建一个488×430像素的登录界面
创建一个488×500像素的注册界面
方法代码示例:
JFrame gameJFrame=new JFrame(); //创建界面对象
gameJFrame.setSize(603,680); //设置界面大小 界面默认隐藏
gameJFrame.setVisible(true); //显示/隐藏界面 方法参数为boolean变量,true则显示界面,false隐藏。
二、编辑界面
设置界面标题及各种内容。
相关方法示例:
JFrame jframe=new JFrame(); //创建界面对象
jframe.setTitle("游戏标题"); //设置界面标题
jframe.setAlwaysOnTop(true); //界面置顶
jframe.setLocationRelativeTo(null); //设置界面初始位置居中
jframe.setDefaultCloseOperation(3); //设置关闭模式 参数为int
//0:点关闭啥也不做 1:默认关闭
//2:若有多个界面则只有在关闭最后一个界面时虚拟机才会终止,前提:每个界面关闭模式都为2
//3:只要关闭其中一个界面,虚拟机直接停止
三、编辑界面菜单
设置界面中菜单和菜单中的不同功能以及对应的各种条目
相关方法示例:
JFrame jframe=new JFrame(); //创建界面对象
//创建 菜单 对象
JMenuBar jmenuBar=new JMenuBar();
//创建 菜单选项1 和 菜单选项2 对象
JMenu functionJMenu=new JMenu("功能");
JMenu aboutJMenu=new JMenu("关于我们");
//创建 条目 对象
JMenuItem relodGame=new JMenuItem("重新开始");
JMenuItem relogIn=new JMenuItem("重新登录");
JMenuItem closeGame=new JMenuItem("关闭游戏");
//创建 条目 对象
JMenuItem officialAccount=new JMenuItem("公众号");
//调用方法将条目对象添加到菜单选项1中
functionJMenu.add(relogIn);
functionJMenu.add(relodGame);
functionJMenu.add(closeGame);
//调用方法将条目对象添加到菜单选项2中
aboutJMenu.add(officialAccount);
//将选项添加到菜单中
jmenuBar.add(functionJMenu);
jmenuBar.add(aboutJMenu);
//将菜单添加到界面中
jframe.setJMenuBar(jmenuBar);
四、添加图片、调整图片位置
添加图片相关方法示例代码:
//创建图片ImageIcon对象
ImageIcon icon=new ImageIcon("C:\\Users\\DDDic\\IdeaProjects\\PuzzleGame\\image\\animal\\animal3\\3.jpg");
//构造方法参数为图片文件地址
//创建管理容器对象 JLabel 将图片对象icon放入
JLabel jLabel=new Jlabel(icon);
//将容器添加进界面对象jmenuBar中
jmenuBar.add(jLabel);
//指定图片位置
创建图片和管理容器对象代码合并:
JLabel jLabel=new Jlabel(new ImageIcon("C:\\Users\\DDDic\\IdeaProjects\\PuzzleGame\\image\\animal\\animal3\\3.jpg"));
调整图片位置相关代码:
//设置图片位置
//方法参数为:(x坐标,y坐标,图片宽度,图片长度)
jLabel.setBounds(105*j,105*i,105,105);
//将图片添加入界面中
GameJFrame.getContentPane().add(jLabel);
//getContentPane 方法就是调用下图中红色框表示的容器,将图片加入该容器
调整位置需要在界面初始化代码中增加以下代码:
this.setAlwaysOnTop(true); //true 置顶窗口
this.setLocationRelativeTo(null); //设置界面初始位置居中
//取消界面默认的居中放置,将其设置为null,按照x,y轴坐标放置图片
GameJFrame.setLayout(null);
原因:图中红色框内是创建界面时自动生成的一个容器,默认状态会将接受的图片或者其他类进行居中放置,因此需要调用方法取消默认的居中放置。
五、添加事件
事件源:按钮/图片/窗体
事件:某些操作 如:鼠标单击 鼠标划入....
监听绑定:当事件源上发生了某个事件,则执行某段代码。
键盘监听:KeyListener 鼠标监听:MouseListener 动作监听:ActionListener
给按钮添加动作事件:
示例代码:
package com.java.ui;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MyActionListener implements ActionListener {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮按下了");
}
}
package com.java.ui;
import javax.swing.*;
import java.util.Random;
public class Test {
public static void main(String[] args){
JFrame jframe=new JFrame(); //创建界面对象
jframe.setSize(500,500);
jframe.setLayout(null);
//创建一个按钮对象
JButton jtb=new JButton("点击按钮");
//设置坐标位置
jtb.setBounds(0,0,100,50);
//给按钮添加动作监听 方法参数为ActionListener 接口类型,因此需要使用这个接口的实现类 表示触发后执行的代码
jtb.addActionListener(new MyActionListener());
//将按钮加入界面中
jframe.getContentPane().add(jtb);
jframe.setVisible(true);
}
}
由于实际情况中,每个按钮功能不一样,且动作监听接口的实现类只会在触发时被调用一次,因此可以采用 匿名内部类的形式进行简化代码:
package com.java.ui;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class Test {
public static void main(String[] args){
JFrame jframe=new JFrame(); //创建界面对象
jframe.setSize(500,500);
jframe.setLayout(null);
//创建一个按钮对象
JButton jtb=new JButton("点击按钮");
//设置坐标位置
jtb.setBounds(0,0,100,50);
//给按钮添加动作监听 方法参数为ActionListener 接口类型,
//因此需要使用这个接口的实现类 表示触发后执行的代码
jtb.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被按咯");
}
});
//将按钮加入界面中
jframe.getContentPane().add(jtb);
jframe.setDefaultCloseOperation(3);
jframe.setVisible(true);
}
}
除此以外还有另一种方式:
package com.java.ui;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class MyJFrame extends JFrame implements ActionListener {
//创建一个按钮对象
JButton jtb=new JButton("点击按钮1");
//创建另一个按钮对象
JButton jtb2=new JButton("点击按钮2");
public MyJFrame(){
this.setSize(500,500);
this.setLayout(null);
//设置坐标位置
jtb.setBounds(0,0,100,50);
jtb2.setBounds(100,0,100,50);
//给按钮添加动作监听 方法参数为ActionListener 接口类型,因此需要使用这个接口的实现类 来执行实现类中设定的触发后的执行代码
//而本类已经是ActionListener接口的实现类,因此this记录的就是本类地址,直接进入本类中对应重写执行代码部分,执行触发代码。
jtb.addActionListener(this);
jtb2.addActionListener(this);
//将按钮加入界面中
this.getContentPane().add(jtb);
this.getContentPane().add(jtb2);
this.setDefaultCloseOperation(3);
this.setVisible(true);
}
@Override
public void actionPerformed(ActionEvent e) {
//对当前按钮进行判断
Random r=new Random();
Object source=e.getSource();//getSource()方法:获取当前被操作的按钮对象
if(source==jtb)
jtb.setSize(200,200);//设置按钮大小
else if(source==jtb2)
jtb2.setBounds(r.nextInt(500),r.nextInt(500),100,50);
}
}
package com.java.ui;
public class Test {
public static void main(String[] args){
new MyJFrame();
}
}
给按钮添加鼠标事件:
package com.java.ui;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.Random;
public class MyJFrame extends JFrame implements MouseListener {
public MyJFrame(){
this.setSize(500,500);
//创建一个按钮对象
JButton jtb=new JButton("点击按钮1");
this.setLayout(null);
//设置按钮坐标位置
jtb.setBounds(0,0,100,50);
//给按钮绑定鼠标监听 本类就是MouseListener接口的实现类,因此直接用this代表实现类
jtb.addMouseListener(this);
this.getContentPane().add(jtb);
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("划出");
}
}
package com.java.ui;
public class Test {
public static void main(String[] args){
new MyJFrame();
}
}
给窗体添加键盘事件:
package com.java.ui;
import javax.swing.*;
import java.awt.event.*;
import java.util.Random;
public class MyJFrame extends JFrame implements KeyListener {
public MyJFrame(){
this.setSize(500,500);
this.setLayout(null);
//给窗口增加键盘监听
this.addKeyListener(this);
this.setVisible(true);
}
@Override
public void keyTyped(KeyEvent e) {
}
//若按下不松,则会重复调用KeyPressed方法
@Override
public void keyPressed(KeyEvent e) {
System.out.println("按下");
}
//区分键盘按下的按键是哪一个 使用 getKeyCode方法
//返回的是每个按键的编号
@Override
public void keyReleased(KeyEvent e) {
System.out.println("松开");
int code=e.getKeyCode();
System.out.println((char)code);
}
}
六、为拼图添加背景图片、为图片添加边框
Tips:
在窗口中添加图片,先添加的图片在上方,后添加的图片在下方,因此背景图片需要放在最后添加进窗口。
添加边框代码:
//先加载的图片在上方,后加载的图片在下面,背景图片放最后。
ImageIcon icon=new ImageIcon("C:\\Users\\DDDic\\IdeaProjects\\PuzzleGame\\image\\background.png");
JLabel jbar=new JLabel(icon);
//添加边框是对容器类JLabel 的对象调用setBorder()方法
//BevelBorder()是边框类 参数0表示凸起 1表示凹陷
// 0也可以用 BevelBorder.RAISED 表示
// 1也可以用BevelBorder.LOWERED表示
jbar.setBorder(new BevelBorder(0));
jbar.setBounds(40,40,508,560);
this.getContentPane().add(jbar);
七、代码路径调整
路径种类:
①绝对路径:从盘符开始 :C:\ D:\
②相对路径:不是从盘符开始 : aaa\bbb 在当前项目下去找aaa文件夹,里面去找bbb文件夹
路径转换:
//绝对路径
JLabel jLabel=new JLabel(new ImageIcon("C:\\Users\\DDDic\\IdeaProjects\\PuzzleGame\\image\\animal\\animal3\\"+number+".jpg"));
//相对路径 从模块名字开始image开始(大家都在一个项目里,没有相对的意义,删去项目名)
JLabel jLabel=new JLabel(new ImageIcon("image\\animal\\animal3\\"+number+".jpg"));