# 事件
# 键盘事件
package event;
import javax.swing.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
public class main {
public static void main(String[] args) {
new GameJFram();
}
}
class GameJFram extends JFrame implements KeyListener {
public GameJFram() {
this.setTitle("键盘事件");
this.setSize(400, 400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//给整个窗体添加键盘监听
//调用者this:本类对象,当前界面的对象 表示我要给整个界面添加监听
//addKeyListener(KeyListener l)//表示要给本界面添加键盘监听
//参数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("键盘松开事件");
}
}
# 按钮事件
package event;
import javax.swing.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
//按钮动作监听
public class ActionLister {
public static void main(String[] args) {
new Action();
}
}
class Action extends JFrame {
//添加按钮
JButton jButton = new JButton("按钮");
public Action() {
this.setTitle("按钮事件");
this.setSize(400, 400);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//取消默认居中放置
this.setLayout(null);
//设置按钮位置大小
jButton.setBounds(100, 100, 100, 100);
//给按钮添加点击事件
//调用者jButton:按钮对象, 表示我要给该按钮添加键盘监听事件
//addActionListener(KeyListener l)//表示要给按钮添加按下监听
//参数this:表示当事件触发后 会执行本类中的对应代码 actionPerformed
//匿名内部类
jButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("按钮点击");
//随机让按钮改变位置
Random random = new Random();
int x = random.nextInt(300);
int y = random.nextInt(300);
jButton.setLocation(x, y);
}
});
//将按钮添加入窗体中
this.getContentPane().add(jButton);
this.setVisible(true);
}
}
# 鼠标监听
上述讲过actionListener后如果想监听一个鼠标的单击事件,有几种方式
- 通过
actionListener进行动作监听 - 鼠标监听中的单击事件
- 鼠标监听中的双击事件
# 方法一 使用匿名内部类
package event;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class mouseListener {
public static void main(String[] args) {
new mouseLister();
}
}
class mouseLister extends JFrame {
//创建按钮对象
JButton jb = new JButton("按钮");
public mouseLister() {
//设置界面标题
setTitle("鼠标事件监听");
//设置界面大小
setSize(400, 300);
//设置默认居中
this.setLocationRelativeTo(null);
//设置关闭方式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//取消默认居中放置
setLayout(null);
//设置按钮位置
jb.setBounds(100, 100, 100, 50);
//将按钮添加到整个的页面当中
this.getContentPane().add(jb);
//给按钮绑定鼠标事件
jb.addMouseListener(new MouseListener() {
@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("鼠标划出事件");
}
});
//设置界面可见
setVisible(true);
}
}
# 方法二 使用接口
package event;
import javax.swing.*;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
public class mouseListener {
public static void main(String[] args) {
new mouseLister();
}
}
class mouseLister extends JFrame implements MouseListener {
//创建按钮对象
JButton jb = new JButton("按钮");
public mouseLister() {
//设置界面标题
setTitle("鼠标事件监听");
//设置界面大小
setSize(400, 300);
//设置默认居中
this.setLocationRelativeTo(null);
//设置关闭方式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//取消默认居中放置
setLayout(null);
//设置按钮位置
jb.setBounds(100, 100, 100, 50);
//将按钮添加到整个的页面当中
this.getContentPane().add(jb);
//给按钮绑定鼠标事件
//使用接口实现方法
jb.addMouseListener(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("鼠标离开事件");
}
}
# mouseListener方法摘要
| 方法名 | 说明 |
|------------------------------------|-----------------------|
| void mouseClicked(MouseEvent e) | 在组件上单击(按下并释放),鼠标按钮时调用 |
| void mousePressed(MouseEvent e) | 在组件上单击(按下),鼠标按钮时调用 |
| void mouseReleased(MouseEvent e) | 在组件上释放鼠标按钮时调用 |
| void mouseEntered(MouseEvent e) | 鼠标进入组件时调用 |
| void mouseExited(MouseEvent e) | 鼠标离开组件时调用 |
# 键盘监听机制
keyListener
# 方法摘要
| 方法名 | 说明 |
|---|---|
void keyTyped(KeyEvent e) | 键入建时调用 |
void keyReleased(KeyEvent e) | 释放键时调用 |
void keyPressed(KeyEvent e) | 按下键时调用 按下不松会反复进行调用 |
package event;
import javax.swing.*;
import java.awt.event.KeyEvent;
public class KeyListener {
public static void main(String[] args) {
new keyLister();
}
}
class keyLister extends JFrame {
public keyLister() {
//设置窗体标题
setTitle("keyListener");
//设置窗体大小
setSize(300, 300);
//取消元素默认居中
setLocationRelativeTo(null);
//设置窗体关闭模式
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置键盘监听
this.addKeyListener(new java.awt.event.KeyListener() {
//键盘任意键按下
@Override
public void keyTyped(KeyEvent e) {
System.out.print("键盘任意键按下");
System.out.println(e);
}
//按下键时调用
//按下不松会反复进行调用
@Override
public void keyPressed(KeyEvent e) {
System.out.print("按下键时调用");
System.out.println(e);
}
//释放键时调用
@Override
public void keyReleased(KeyEvent e) {
System.out.print("释放键时调用");
System.out.println(e);
}
});
//设置窗体可见
setVisible(true);
}
}
# 拼图小游戏 主窗体部分代码
package qranqi.ui;
import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.Random;
public class GameJFram extends JFrame {
//完成的数组
final int[][] finallList = new int[][]{
{1, 2, 3},
{4, 5, 6},
{7, 8, 0}
};
//窗体大小
int width = 0;
int height = 0;
//创建一个二维数组 4*4
int[][] list = new int[3][3];
//记录0的位置
int x = 0;
int y = 0;
//步数
int step = 0;
//游戏主入口界面
public GameJFram(String title, int width, int height) {
this.width = width;
this.height = height;
initJFram(title, width, height);
//设置导航条
setMneuBar();
//初始化数组
initData();
//初始化图片
initImages();
//给界面添加键盘监听
initKeyListener();
//界面显示 建议写到最后
setVisible(true);
}
//加载二维数组
private void initData() {
int[] arr = {1, 2, 3, 4, 5, 6, 7, 8, 0};
Random random = new Random();
//打乱数组
for (int i = 0; i < arr.length; i++) {
int index = random.nextInt(arr.length);
//两值交换
int temp = arr[i];
arr[i] = arr[index];
arr[index] = temp;
}
//将打乱后的数据放入二维数组中
for (int i = 0; i < arr.length; i++) {
if (arr[i] == 0) {
x = i / 3;
y = i % 3;
}
list[i / 3][i % 3] = arr[i];
}
}
//加载图片
private void initImages() {
//清空已经加载的图片
this.getContentPane().removeAll();
//设置统计步数
JLabel labelText = new JLabel("步数:" + step);
labelText.setBounds(0, 0, 100, 40);
this.getContentPane().add(labelText);
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
//创建一个ImageIcon图片容器对象
ImageIcon icon = new ImageIcon(new ImageIcon("static/animation/animation1/" + list[i][j] + ".jpg").getImage().getScaledInstance(200, 200, Image.SCALE_DEFAULT));
//创建一个JLabel对象(管理容器)并放入图片
JLabel label = new JLabel(icon);
//设置图片位置
label.setBounds(200 * j, (200 * i) + 40, 200, 200);
//设置斜面浮雕边框
//bevelType 0表示凹陷,1表示凸起
label.setBorder(new BevelBorder(0, Color.white, Color.white));
//添加入隐藏容器中当中
this.getContentPane().add(label);
}
}
//刷新界面
this.getContentPane().repaint();
}
//加载窗体界面
private void initJFram(String title, int width, int height) {
this.setTitle(title);
this.setSize(width, height);
//页面始终置顶
this.setAlwaysOnTop(true);
//界面居中
this.setLocationRelativeTo(null);
//设置界面的关闭模式
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
//WindowConstants.EXIT_ON_CLOSE 关闭界面时退出程序
//WindowConstants.DISPOSE_ON_CLOSE 关闭界面不做任何操作
//WindowConstants.HIDE_ON_CLOSE 关闭界面时隐藏
//取消默认的居中放置 只有取消了才会根据我们设置的xy轴排列
this.setLayout(null);
}
//设置导航条
private void setMneuBar() {
JMenuBar menuBar = new JMenuBar() {
{
add(
new JMenu("功能") {
{
add(new JMenuItem(new AbstractAction("重新开始") {
@Override
public void actionPerformed(ActionEvent e) {
reset();
}
}));
add(new JMenuItem("重新登录"));
add(new JMenuItem(new AbstractAction("关闭界面") {
@Override
public void actionPerformed(ActionEvent e) {
//关闭界面
System.exit(0);
}
}));
}
}
);
add(new JMenu("关于我们"));
}
};
this.setJMenuBar(menuBar);
}
//重新开始游戏
private void reset() {
step = 0;
initData();
initImages();
}
//判断是否胜利
private boolean isWin(int[][] listData) {
for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (listData[i][j] != finallList[i][j]) return false;
return true;
}
private void initKeyListener() {
//给界面添加键盘监听
this.addKeyListener(new KeyAdapter() {
@Override
public void keyReleased(KeyEvent e) {
int keyCode = e.getKeyCode();
if (isWin(list)) {
//显示确定提示框 点击确认后刷新界面
int result = JOptionPane.showConfirmDialog(GameJFram.this, "恭喜你,你赢了!", "提示", JOptionPane.DEFAULT_OPTION);
System.out.println(result);
reset();
return;
}
if (keyCode == 38) {
if (x < 2) {
//交换两值
int temp = list[x][y];
list[x][y] = list[x + 1][y];
list[x + 1][y] = temp;
x++;
step++;
initImages();
}
} else if (keyCode == 40) {
if (x > 0) {
//交换两值
int temp = list[x][y];
list[x][y] = list[x - 1][y];
list[x - 1][y] = temp;
x--;
step++;
initImages();
}
} else if (keyCode == 39) {
if (y > 0) {
//交换两值
int temp = list[x][y];
list[x][y] = list[x][y - 1];
list[x][y - 1] = temp;
y--;
step++;
initImages();
}
} else if (keyCode == 37) {
if (y < 2) {
//交换两值
int temp = list[x][y];
list[x][y] = list[x][y + 1];
list[x][y + 1] = temp;
y++;
step++;
initImages();
}
}
//添加作弊按钮
else if (keyCode == 27) {
//克隆原始数组
for (int i = 0; i < finallList.length; i++)
System.arraycopy(finallList[i], 0, list[i], 0, finallList[i].length);
x = 2;
y = 2;
initImages();
}
//松开显示完整图片按钮a
else if (keyCode == 65) initImages();
}
public void keyPressed(KeyEvent e) {
int keyCode = e.getKeyCode();
//按下a不松显示完整图片
if (keyCode == 65) {
//清空页面上所有图片
GameJFram.this.getContentPane().removeAll();
//加载完整图片
//创建一个ImageIcon图片容器对象
ImageIcon icon = new ImageIcon(new ImageIcon("static/animation/animation1/all.jpg").getImage().getScaledInstance(600, 600, Image.SCALE_DEFAULT));
JLabel all = new JLabel(icon);
all.setBounds(0, 40, 600, 600);
GameJFram.this.getContentPane().add(all);
GameJFram.this.getContentPane().repaint();
}
}
});
}
}