一,项目介绍和界面搭建
1.主界面分析
理解:JFrame相当于创建了一个窗体,JMenuBar就是一个菜单栏,JLabel就相当于一个容器,因为JLabel是管理文字和图片的容器,就比如说你想在JFrame里面放图片或者文字,先创建一个JLabel这样的一个篮子作为载体,把图片或者文字放到篮子里面,一个图片只能放到一个篮子里面,同理,文字也是一样,然后再把JLabel放到JFrame里面。
练习:
1.创建一个游戏主界面(宽603像素,高680像素)
2.创建一个登入界面(宽488像素,高430像素)
3.创建一个注册界面(宽488像素,高500像素)
分别创建三个类和一个app.java类来实现各自的功能
extends JFrame:说明他是一个类,继承了JFrame
步骤:1.extends类
2.创建空参构造函数
3.添加对应方法
注意点:
1.属性,对象尽量写在方法外,这样在其他的方法里面也可以调用这个属性
2.用this
2.创建主界面
public class GameJFrame extends JFrame{
public GameJFrame(){
this.setTitle("界面title");//标题
this.setSize(603,680);//大小,宽高
this.setAlwaysOnTop(true);//界面置顶
this.setLocationRelativeTo(null);//界面位置居中
this.setDefaultCloseOperation(2);//关闭方式
this.setVisible(true);//显示
}
步骤:
1.extends JFrame:继承JFrame,继承里面的可以继承的方法
2.创建空参构造方法
3.标题,大小,置顶 ,居中,关闭,显示
注意点:
1.居中方式有两种方式:1.setLocationRelativeTo(),居于界面中。2.setLocation(x,y),位置自己定义
2.setAlwaysOnTop(),有0,1,2,3。
- 0是啥都不做
- 1是默认关闭方式,默认为1
- 2是如果开启多个界面,只有关闭最后一个界面,jvm才会停止。
- 3是关闭任何一个界面,jvm都会停止
1.先创建JMenuBar
2.再创建JMenu
3.最后创建JMenuItem
将JMenuItem放入JMenu,再将JMenu放入JMenuBar里面,add(放入)
二,JMenu——
public void setJFrame(){
//1.界面弄好
this.setTitle("拼图小游戏");//标题
this.setSize(603,680);//大小,宽高
this.setAlwaysOnTop(true);//界面置顶
this.setLocationRelativeTo(null);//界面位置居中
this.setDefaultCloseOperation(2);//关闭方式
//2.添加菜单按钮,因为在界面里面显示,直接写在这里
JMenuBar menuBar = new JMenuBar();
JMenu menu1 = new JMenu("功能");
JMenu menu2 = new JMenu("关于我们");
JMenuItem item11 = new JMenuItem("更换图片");
JMenuItem item12 = new JMenuItem("重新游戏");
JMenuItem item13 = new JMenuItem("重新登录");
JMenuItem item14 = new JMenuItem("关闭游戏");
JMenuItem item21 = new JMenuItem("公众号");
menu1.add(item11);
menu1.add(item12);
menu1.add(item13);
menu1.add(item14);
menu2.add(item21);
menuBar.add(menu1);
menuBar.add(menu2);
this.setJMenuBar(menuBar);
}
1.创建了一个新的类setJFrame类,为了设置界面,这样子在主方法里面就可以直接setJFrame()
2.设置菜单或者按钮,必须要先有一个JFrame界面吧,所以JMenuBar或者JButton代码放在界面后面
3.JMenuItem添加(add)进JMenu,将JMenu放入JMenuBar(add)
4.要将JMenuBar添加到JFrame里面去,用的方法不是getContentPane()也不是add(),而是this.setJMenuBar()。
三,图片
图片是由ImageIcon类创建的对象
1.添加图片
public void initImage(){
//图片是ImageIcon的对象
ImageIcon image= new ImageIcon("Puzzlegame\\src\\Image\\image\\girl\\girl1\\1.jpg");
//创建Jlabel对象(管理图片的容器)
JLabel jlabel = new JLabel(image);
//把JLabel放入JFrame
this.add(jlabel);
}
- 由ImageIcon创建图片对象
- 直接将path传入到括号里面,相对路径和绝对路径都可以,/和\\都可以
- 再创建JLabel,直接将JLabel里面括号添加文字和图片,试过add方法,不求行
- this指的是JFrame界面
- this.add(jLabel);
1.1 添加多张图片
1)坐标原点
左x下y
2)怎么按照原点
public void initImage(){
//图片是ImageIcon的对象
ImageIcon image= new ImageIcon("Puzzlegame\\src\\Image\\image\\girl\\girl1\\1.jpg");
//创建Jlabel对象(管理图片的容器)
JLabel jlabel = new JLabel(image);
jlabel.setBounds(0,0,105,105);//指定容器位置,即图片位置
//把JLabel放入JFrame
//this.add(jlabel);
this.getContentPane().add(jlabel);
}
- 给容器用setBounds(int x ,int y ,int width ,int height)方法;
- 原本默认显示正中央
- JFrame只是一个大的架子,有一个隐藏容器来显示所有组件
- 是JFrame里面的东西,只要创建了JFrame,这个容器就出现了
- 通过setLayout(null),取消默认的居中放置,在JFrame里面添加这个方法
- 需要在初始化界面的时候就把默认居中取消
3)最终代码
public void initImage(){
int number = 1;
for(int i = 0;i<data.length;i++){
for(int j = 0;j<data[i].length;j++){
//图片是ImageIcon的对象
ImageIcon image= new ImageIcon("Puzzlegame\\src\\Image\\image\\girl\\girl1\\"+number+".jpg");
number++;//number是可以取到16,如果没有16,则默认加载JLabel加载了一个空白
//创建Jlabel对象(管理图片的容器)
JLabel jlabel = new JLabel(image);
jlabel.setBounds(105*i,105*j,105,105);//指定容器位置,即图片位置
//把JLabel放入JFrame
//this.add(jlabel);
this.getContentPane().add(jlabel);
}
}
- 我自己定义了一个data,是二维数组int[4][4],也可以不用定义,一共有1-15张照片,还有一个all.jpg,每一个图片的命名都和数字一一对应,所以可以映射到数字上面,用number来接受这个数字,初始值定义为1,如果没有16,JFrame也会默认加载一个JLabel,去存储一个空白图片
2.打乱图片
public void initImage(){
for(int i = 0;i<data.length;i++){
for(int j = 0;j<data[i].length;j++){
int number = data[i][j];
//图片是ImageIcon的对象
ImageIcon image= new ImageIcon("Puzzlegame\\src\\Image\\image\\girl\\girl2\\"+number+".jpg");
JLabel jlabel = new JLabel(image);
jlabel.setBounds(105*i,105*j,105,105);//指定容器位置,即图片位置
//把JLabel放入JFrame
//this.add(jlabel);
this.getContentPane().add(jlabel);
}
}
}
//图片数据
public void initDate(){
int[] arr = {1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,0};
Random r = new Random();
int index = r.nextInt(16);
for(int i = 0;i<16;i++){
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
int count = 0;
for(int i = 0;i<4;i++){
for(int j = 0;j<4;j++){
data[i][j]= arr[count];
count++;
}
}
}
四,事件
- 事件源:按钮,图片,窗体...
- 事件:某些操作,比如:鼠标单击,鼠标划入...
- 绑定事件,当事件源发生了某个事件,则执行某段代码
KeyListener:键盘监听,用键盘进行操作
MouseListener:鼠标监听,用鼠标进行操作
ActionListener :动作监听,简化版,键盘tab和鼠标左键单击
4.1JButton
public class Test {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
jFrame.setTitle("界面title");
jFrame.setSize(600,500);
jFrame.setAlwaysOnTop(true);
jFrame.setLocationRelativeTo(null);
jFrame.setDefaultCloseOperation(2);
jFrame.setLayout(null);//xy
//创建按钮
JButton jbt = new JButton("按钮名字");
jbt.setBounds(0,0,100,50);
//要给添加事件了
jbt.addActionListener(new MyActionListener());
jFrame.getContentPane().add(jbt);
jFrame.setVisible(true);
}
}
- 先创建一个JFrame,在JFrame里面添加JButton,直接给JButton添加名字
- setBounds(x,y,width,heigth)
设置大小位置上面两部就相当于JButton搞完
- 再给按钮添加事件JButton.addActionListener()、JButton.addMouseListener()、JButton.addKeyListener()
- 添加事件后,就重写接口里面的方法,三个事件都是接口interface