【JAVA入门】Day17 - GUI
文章目录
- 【JAVA入门】Day17 - GUI
- 一、组件
- 二、事件
GUI 即图形化界面。
一、组件
一个 Java 的图形化界面项目主要用到了下面几种组件。
- Java 中最外层的窗体叫做 JFrame。
- Java 中最上层的菜单叫做 JMenuBar。
- Java 中管理文字和图片的容器叫做 JLabel。
【练习1】创建主界面1。
public class App {
public static void main(String[] args) {
//表示程序的启动入口
//想要启动哪个界面,就创建它的对象
new LoginJFrame(); //调用默认空参构造方法
}
}
public class GameJFrame extends JFrame {
//1.创建一个游戏的主界面
//属性(宽 高) 行为 setSize setVisible
//规定:GameJFrame 这个界面表示的是游戏的主界面
public GameJFrame() {
this.setSize(603, 680);
this.setVisible(true);
}
}
public class RegisterJFrame extends JFrame {
//注册界面
public RegisterJFrame() {
this.setSize(488, 430);
this.setVisible(true);
}
}
public class LoginJFrame extends JFrame {
//登录界面
public LoginJFrame() {
this.setSize(488, 430);
this.setVisible(true);
}
}
【练习2】设置 GameJFrame的相关方法。
public GameJFrame() {
//设置界面的宽高
this.setSize(603, 680);
//设置界面的标题
this.setTitle("拼图单机版 v1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置游戏的关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//让窗体显示出来,建议写在最后
this.setVisible(true);
}
【练习3】在 GameJFrame 窗体上方添加菜单。
public GameJFrame() {
//设置界面的宽高
this.setSize(603, 680);
//设置界面的标题
this.setTitle("拼图单机版 v1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置游戏的关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//初始化菜单
//创建整个的菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上的两个选项的对象(功能 关于我们)
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//创建选项下面的条目对象
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reloginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//将每一个选项下的条目添加到选项当中
functionJMenu.add(replayItem);
functionJMenu.add(reloginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//将菜单里的两个选项添加到菜单当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
//让窗体显示出来,建议写在最后
this.setVisible(true);
}
将构造方法中的代码进行抽取,抽取到不同的方法中。
public GameJFrame() {
//初始化界面
initJFrame();
//初始化菜单
initJMenuBar();
//让窗体显示出来,建议写在最后
this.setVisible(true);
}
private void initJMenuBar() {
//初始化菜单
//创建整个的菜单对象
JMenuBar jMenuBar = new JMenuBar();
//创建菜单上的两个选项的对象(功能 关于我们)
JMenu functionJMenu = new JMenu("功能");
JMenu aboutJMenu = new JMenu("关于我们");
//创建选项下面的条目对象
JMenuItem replayItem = new JMenuItem("重新游戏");
JMenuItem reloginItem = new JMenuItem("重新登录");
JMenuItem closeItem = new JMenuItem("关闭游戏");
JMenuItem accountItem = new JMenuItem("公众号");
//将每一个选项下的条目添加到选项当中
functionJMenu.add(replayItem);
functionJMenu.add(reloginItem);
functionJMenu.add(closeItem);
aboutJMenu.add(accountItem);
//将菜单里的两个选项添加到菜单当中
jMenuBar.add(functionJMenu);
jMenuBar.add(aboutJMenu);
//给整个界面设置菜单
this.setJMenuBar(jMenuBar);
}
private void initJFrame() {
//设置界面的宽高
this.setSize(603, 680);
//设置界面的标题
this.setTitle("拼图单机版 v1.0");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置游戏的关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
【练习4】添加图片。
private void initImage() {
//创建一个图片ImageIcon的对象
ImageIcon icon = new ImageIcon("D:\\IdeaProjects\\PuzzleGame\\image\\daxiaoqiao\\1.jpg");
//创建一个JLabel的对象(管理容器)
JLabel jLabel = new JLabel(icon);
//把管理容器添加到界面中
this.add(jLabel);
}
注意:窗体和图片之间其实还有一个隐藏的容器(布局方式容器),这个容器可以用 getContentPane() 来获取,我们添加的图片,实质上是添加进了这个容器当中,如果没有设定这个容器的特殊要求,它会默认把图片放到居中位置。如果不想将图片放到正中央,就需要把这个默认机制取消掉,我们可以使用 setLayout(null) 来实现。
//在JFrame的初始化方法中
//取消掉默认居中布局
this.setLayout(null);
private void initImage() {
//创建一个图片ImageIcon的对象
ImageIcon icon = new ImageIcon("D:\\IdeaProjects\\PuzzleGame\\image\\daxiaoqiao\\1.jpg");
//创建一个JLabel的对象(管理容器)
JLabel jLabel = new JLabel(icon);
//指定图片位置
jLabel.setBounds(0, 0, 105, 105);
//把管理容器添加到布局容器中
this.getContentPane().add(jLabel);
}
【练习5】打乱一维数组中的数据。
需求:把一个一维数组中的数据:0~15打乱顺序,然后再以4个一组的方式添加到二维数组中。
package test;
import java.util.Random;
public class RandomTest {
public static void main(String[] args) {
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 = 0;
//交换两个索引上的数据
temp = tempArr[i];
tempArr[i] = tempArr[index];
tempArr[index] = temp;
//遍历数组
System.out.print(tempArr[i]+" ");
}
System.out.println();
//创建一个二维数组
int[][] data = new int[4][4];
//给二维数组添加数据
//遍历tempArr每一个元素,把每一个元素依次添加到二维数组中
for (int i = 0; i < tempArr.length; i++) {
data[i / 4][i % 4] = tempArr[i];
}
//遍历二维数组
for(int i = 0 ;i < 4; i++) {
for(int j = 0; j < 4; j++) {
System.out.print(data[i][j] + " ");
}
System.out.println();
}
}
}
【练习6】打乱图片。
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;
}
//给二维数组添加数据
//遍历tempArr每一个元素,把每一个元素依次添加到二维数组中
for (int i = 0; i < tempArr.length; i++) {
data[i / 4][i % 4] = tempArr[i]; //巧妙运用数学知识,一行完成二维数组元素的添加
}
}
private void initImage() {
for(int i = 0 ; i < 4; i++){
for (int j = 0; j < 4; j++) {
//创建一个图片ImageIcon的对象
ImageIcon icon = new ImageIcon("D:\\IdeaProjects\\PuzzleGame\\image\\daxiaoqiao\\" + data[i][j] + ".jpg");
//创建一个JLabel的对象(管理容器)
JLabel jLabel = new JLabel(icon);
//指定图片位置
jLabel.setBounds(105 * j, 105 * i + 4, 105, 105);
//把管理容器添加到界面中
this.getContentPane().add(jLabel);
}
}
二、事件
事件,就是可以被组件识别的操作。当你对组件做了某种事情后,就会执行相应的代码。
GUI 中的事件源可以是按钮、图片、窗体等等控件。
鼠标点击、鼠标划入等等操作都统称为事件。
当事件源上发生了某个事件,则执行某段代码,这个行为叫做绑定监听。
- KeyListner 键盘监听
- MouseListener 鼠标监听
- ActionListener 动作监听
【练习7】写一个按钮的事件监听。
按钮用 JButton 类创建。事件监听需要导包,导入 ActionEvent 和 ActionListener。
package test;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class EventTest {
public static void main(String[] args) {
JFrame jFrame = new JFrame();
//设置界面宽高
jFrame.setSize(603, 680);
//设置界面标题
jFrame.setTitle("事件演示");
//设置界面置顶
jFrame.setAlwaysOnTop(true);
//设置界面居中
jFrame.setLocationRelativeTo(null);
//设置关闭模式
jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消组件默认居中放置
jFrame.setLayout(null);
//创建一个按钮对象
JButton jbt = new JButton("点我");
//设置按钮位置和宽高
jbt.setBounds(0,0,100,50);
//给按钮添加动作监听
//jbt:组件对象,表示要给哪个组件添加事件
//addActionListener:表示我要给组件添加哪个事件监听(动作监听包括两种:鼠标左键点击,空格按下)
//()中应该传入一个接口的实现类对象,该对象是ActionListener的对象,可以用匿名内部类作为参数
//该参数表示:事件被触发后要执行的代码
jbt.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮被点击了");
}
});
//把按钮添加入窗体
jFrame.getContentPane().add(jbt);
//显示窗体
jFrame.setVisible(true);
}
}
事件监听还有另一种写法,可以让当前界面去实现 ActionListener 接口。
写一个窗体实现 ActionListener 接口。
package test;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
public class MyJFrame extends JFrame implements ActionListener {
//创建2个按钮,必须在成员位置
JButton jbt1 = new JButton("点我!");
JButton jbt2 = new JButton("点我。");
//构造方法
MyJFrame() {
this.setSize(600,600);
//设置界面的标题
this.setTitle("登录");
//设置界面置顶
this.setAlwaysOnTop(true);
//设置界面居中
this.setLocationRelativeTo(null);
//设置窗口的关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//设置窗口的Layout
this.setLayout(null);
//设置按钮位置大小
jbt1.setBounds(0,0,100,50);
jbt2.setBounds(202,0,100,50);
//给按钮添加事件
//因为当前类实现了ActionListener接口,所以该类本身对象即可作为参数反传递给addActionListener()方法
jbt1.addActionListener(this);
jbt2.addActionListener(this);
//把按钮添加到窗口中
this.getContentPane().add(jbt1);
this.getContentPane().add(jbt2);
//显示窗体
this.setVisible(true);
}
//实现ActionListener接口,重写actionPerformed方法
@Override
public void actionPerformed(ActionEvent e) {
//对当前的按钮进行判断
//获取当前被操作的那个按钮对象
Object source = e.getSource();
if(source == jbt1) {
jbt1.setSize(200,200);
System.out.println("按钮1被按下");
}else{
Random r = new Random();
jbt2.setLocation(r.nextInt(500),r.nextInt(500));
System.out.println("按钮2被按下");
}
}
}
测试类用来创建窗口。
package test;
public class EventTest2 {
public static void main(String[] args) {
MyJFrame myJFrame = new MyJFrame();
}
}