GUI编程
简介
GUI 是图形用户界面的首字母缩写,即允许用户通过图形元素与电子设备(如计算机、笔记本电脑、智能手机和平板电脑)进行交互的界面。在人机交互方面,它是软件应用程序编程的重要组成部分,用用户友好的操作取代基于文本的命令。它的目标是为用户提供易于查找、理解和使用的决策点。换句话说,GUI允许您使用鼠标,笔甚至手指控制设备。
为什么要学习
- 可以写出自己心中想要的一些小工具
- 工作时候,也可能需要维护到swing界面,概率极小!
- 了解MVC架构,了解监听!
核心技术
Swing
AWT
组件
窗口 | 弹窗 | 面板 | 文本框 | 列表框 |
---|---|---|---|---|
按钮 | 图片 | 监听事件 | 鼠标 | 键盘事件 |
AWT
AWT介绍
- 包含了很多类和接口!GUI!
- 元素:窗口,按钮,文本框
- java.awt
组件和容器
万物皆对象
窗口
创建一个窗口对象创建一个窗口对象
Frame frame = new Frame(title); //title是标题名称
设置窗口可见性
frame.setVisible(true) //参数填是否
设置窗口大小
frame.setSize(width,height); //宽,高
设置背景颜色
Color color = new Color(r,g,b,a) //rgb颜色和a透明度,可以进入Color中看一些颜色
frame.setBackground(Color) //参数是color类中颜色,左侧会标注出颜色
窗口弹出初始位置
frame.setLocation(x,y);
设置窗口调整大小固定
frame.setResizable(true); //参数填是否
设置窗口大小及其初始位置
frame.setBounds(x,y,w,h);
设置布局
frame.setLayout(null); //布局管理器
添加组件
frame.add(组件,位置);
自适应设置
frame.pack();
面板
Panel
在容器内,可以看成一个空间,但是不能单独存在
创建面板
Panel panel = new Panel();
Panel设置坐标,相对于Frame
panel.setBounds(x,y,w,h)
Panel设置背景色
panle.setBackground(color)
布局管理器
- 流式布局(从左到右)
- 东西南北中
- 表格布局
布局之间可以嵌套
设置为流式布局
frame.setLayout(new FlowLayout())
FlowLayout.CENTER
//默认在中间出现,从左到右,CENTER | LEFT | LEADING | RIGHT | TRAILING
设置为东西南北中布局
frame.setLayout(new BorderLayout())
BorderLayout.CENTER
//默认中间出现,CENTER | EAST | WEST | SOUTH | NORTH
设置为表格(Grid)布局
frame.setLayout(new GridLayout(行,列,上间距,下间距))
按钮
Button button = new Button(label); //参数为按钮名称
文字性标签提示
Lable lable = new Lable(提示文本);
小作业(布局设计)
//完成代码
package Qin_text_1;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class main {
public static void main(String[] args) {
//新建一个窗口
java.awt.Frame frame = new java.awt.Frame("测试用例1");
//显示窗口
frame.setVisible(true);
//窗口大小
frame.setBounds(500,500,640,500);
//窗口总体为表格布局
GridLayout grid = new GridLayout(2, 1);
frame.setLayout(grid);
//需要四个面板
Panel p1 = new Panel(new BorderLayout()); //东西南北中
Panel p2 = new Panel(new GridLayout(2,1)); //表格
Panel p3 = new Panel(new BorderLayout()); //东西南北中
Panel p4 = new Panel(new GridLayout(2,2)); //表格
//窗口加两个面板进来
frame.add(p1);
frame.add(p3);
//上半部分创作
//填入左右两个按钮
p1.add(new Button("b1"),BorderLayout.EAST);
p1.add(new Button("b2"),BorderLayout.WEST);
//中间再加一个表格面板
p1.add(p2,BorderLayout.CENTER);
//p2加两个按钮
p2.add(new Button("b3"));
p2.add(new Button("b4"));
//下半部分创作
//左右两个按钮
p3.add(new Button("b5"),BorderLayout.EAST);
p3.add(new Button("b6"),BorderLayout.WEST);
//p3中间加一个面板
p3.add(p4,BorderLayout.CENTER);
//加四个按钮
p4.add(new Button("b7"));
p4.add(new Button("b8"));
p4.add(new Button("b9"));
p4.add(new Button("b10"));
//关闭窗口
frame.addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
事件监听
窗口关闭事件
frame.addWindowListener(new WindowAdapter() {
//关闭窗口操作
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});//适配器模式选中单独要用的方法
动作监听
button1.setActionCommand("按钮信息");
class MyactionListener implements ActionListener{
//因为,addActionListener()需要一个ActionListener,所以我们需要构造一个ActionListener
@Override
public void actionPerformed(ActionEvent e) {
//操作
System.out.println("动作监听返回");
//获得按钮的信息
if(e.getActionCommand().equals("对比信息")){
//可以多个按钮一个实例动作
}
}
}
//通常创作一个类来实现ActionListener接口
输入框事件监听(TextField)
TextField textField = new TextField(最大能填的字符数); //新建单行输入框
TextArea textArea = new TextArea(); //新建文本域
textField.addActionListener(); //监听这个文本框输入的文字
class MyActionListener2 implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
TextField field = (TextField)e.getSource();//获得一些资源,返回一个对象
if(field.getText().equals("白鸽")){
System.out.println("文本提交成功!");
};
}
设置字符替换编码
.setEchoChar(‘字符’) //通常用于密码,替换字符显示,字符为char类型
字符串转换int
Integer.parseInt(“对象”)
小作业(小型计算器)
面向过程
package Qin_text_1;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Calc {
public static void main(String[] args) {
new MyFrame();
}
}
class MyFrame extends Frame {
public MyFrame(){
new Frame("计算器");
setLayout(new FlowLayout(FlowLayout.LEFT));
setVisible(true);
//一个lable
Label label = new Label("+");
//三个输入框
TextField textField1 = new TextField(10);
TextField textField2 = new TextField(10);
TextField textField3 = new TextField(20);
//一个按钮
Button button = new Button("=");
button.setActionCommand("结果输出:");
button.addActionListener(new MyAction(textField1,textField2,textField3));
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
pack();
//关闭窗口
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
}
class MyAction implements ActionListener{
private TextField num1,num2,num3;
public MyAction(TextField textField1,TextField textField2,TextField textField3){
this.num1 = textField1;
this.num2 = textField2;
this.num3 = textField3;
}
public MyAction(){}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("结果输出:")){
int text1 = Integer.parseInt(num1.getText());
int text2 = Integer.parseInt(num2.getText());
int text3 = text1+text2;
//转换字符显示到第三个框
num3.setText("" + text3);
num2.setText("");
num1.setText("");
System.out.println(text1+"+"+text2+"="+text3);
}
}
}
纯面向对象
package Qin_text_1;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
public class Calc_object_oriented {
public static void main(String[] args) {
new MyFrame1().loadFrame();
}
}
class MyFrame1 extends Frame {
TextField textField1,textField2,textField3;
public void loadFrame(){
new Frame("计算器");
setLayout(new FlowLayout(FlowLayout.LEFT));
setVisible(true);
//一个lable
Label label = new Label("+");
//三个输入框
textField1 = new TextField(10);
textField2 = new TextField(10);
textField3 = new TextField(20);
//一个按钮
Button button = new Button("=");
button.setActionCommand("结果输出:");
button.addActionListener(new MyAction1(this));
//流式布局组合起来
add(textField1);
add(label);
add(textField2);
add(button);
add(textField3);
pack();
//关闭窗口
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
}
//内部类直接调用
//最大好处:畅通无阻的访问外部类!!!!!!
private class MyAction1 implements ActionListener{
public MyAction1(MyFrame1 myFrame1){}
@Override
public void actionPerformed(ActionEvent e) {
if(e.getActionCommand().equals("结果输出:")){ //判断按钮组件
//获取输入数字
int n1 = Integer.parseInt(textField1.getText());
int n2 = Integer.parseInt(textField2.getText());
//转换字符显示到第三个框
textField3.setText("" + (n1+n2));
//前两个框制空
textField1.setText("");
textField2.setText("");
System.out.println(n1+"+"+n2+"="+(n1+n2));
}
}
}
}
鼠标监听
//鼠标监听器相对于窗口
frame.addMouseListener()
//存鼠标点击的点
points new ArrayList<>();
//适配器模式
private class MyMouseListener extends MouseAdapter{
//鼠标按下,弹起,按住不放
@Override
public void mousePressed(MouseEvent e){
}
}
窗口监听
//重写方法
class MyWindowLintener extends WindowAdapter{
@Override
public void windowClosing(WindowEvent e) {
setVisible(false) //隐藏窗口
System.exit(0);
}
}
//WindowAdapter() 窗口打开时
//windowClosed() 窗口关闭后
//windowActivated() 窗口被激活时
键盘监听
//匿名内部类
addKeyListener(new KeyAdapter() {
@Override
public void keyPressed(KeyEvent e) { //键盘按下出现事件
int keycode = e.getKeyCode();
if (keycode==KeyEvent.VK_UP){
System.out.println("您点击了上键");
}else{
System.out.println("您点击的不是上键");
}
}
});
//e.getCode() 获取当前键盘ASCII码
//KeyEvent. //对应按键码
画笔(paint)
//重写方法
@Override
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawOval(100,100,100,100); //画一个圆
//养成习惯,画笔用完还原颜色(黑色)
}
Frame.repaint() //刷新重画
//左键点击绘画
package Qin_text_1;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.util.ArrayList;
import java.util.Iterator;
public class ClickPaint {
public static void main(String[] args) {
new MyPaintFrame("画布");
}
}
class MyPaintFrame extends Frame {
//新建迭代器
ArrayList points;
public MyPaintFrame(String title){
super(title);
setVisible(true);
setBounds(100,100,600,500);
addWindowListener(new WindowAdapter() {
@Override
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
points= new ArrayList<>();
this.addMouseListener(new MyMouseListener());
}
@Override
public void paint(Graphics g) {
//判断迭代器是否还有东西
Iterator iterator = points.iterator();
while (iterator.hasNext()) {
//如果有就进行画画
Point point = (Point) iterator.next();
g.setColor(Color.BLUE);
g.fillOval(point.x, point.y, 10, 10);
}
}
public void addPaint(Point point){
//加入迭代器
points.add(point);
//刷新绘画
repaint();
}
//一个鼠标监听
private class MyMouseListener extends MouseAdapter
{
@Override
public void mousePressed(MouseEvent e) {
//转换为MyPaintFrame类型来访问addPaint方法
MyPaintFrame frame = (MyPaintFrame) e.getSource();
frame.addPaint(new Point(e.getX(),e.getY()));
}
}
}
定时器
class TimerText implements ActionListener {
//以毫秒为单位
Timer timer = new Timer(100,this); //定时器 100ms执行一次
//事件监听---需要通过固定事件米刷新,1s~10次
@Override
public void actionPerformed(ActionEvent e) {
timer.start(); //定时器开启
}
}
Swing
组件和容器
大体操作和AWT中一样
窗口
//窗口一般是初始化出来的,利用init()方法
public void init(){
JFrame frame = new JFrame("title")
frame.setVisible(true) //可见
frame.setBounds(100,100,600,500) //大小及初始位置
}
关闭事件
frame.setDefaultCloseOperation(WindowConstants.EXIT ON CLOSE) //关闭窗口
//DISPOSE_ON_CLOSE关闭后丢弃
//DO_NOTHING_ON_CLOSE仅关闭
//HIDE_ON_CLOSE关闭后隐藏
容器
//获得一个容器
Container container = JFrame.getContentPane()
container.setBackgtound(Color) //设置背景色
container.setLayout(null) //绝对定位布局
面板
JPanel panel1= new JPanel(new GridLayout(1,3)); //设置面板表格布局1行3列
滚动条面板
JScrollPane scrollPane = new JScrollPane();
标签
lable
//文字标签
JLable lable = new JLable(text,SwingConstants.CENTER) //设置文本居中
label.setHorizontalAlignment(SwingConstants.CENTER) //设置文本水平对齐
图标
//Icon
public class IconDemo extends JFrame implements Icon{
private int width;
private int height;
public IconDemo(){}
public IconDemo(int width,int height){ //有参构造
this.width = width;
this.height = height;
}
public void init(){ //初始化
IconDemo iconDemo = new IconDemo(10,10);
//图标放在标签,也可以放在按钮上!
JLabel icon = new JLabel("icontest", iconDemo, SwingConstants.CENTER);、
//参数(文本,icon,位置)
Container container = getContentPane(); //创建容器
container.add(icon); //添加icon
this.setVisible(true); //窗口可视化
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); //窗口关闭
}
@Override
public void paintIcon(Component c, Graphics g, int x, int y) {
g.fillOval(x,y,width,height); //用画笔画一个圆
}
@Override
public int getIconWidth() {
return this.width;
}
@Override
public int getIconHeight() {
return this.height;
}
}
//传图片----------------------------------------------------------------
public class ImageIconDemo extends JFrame {
public ImageIconDemo(){
JLabel label = new JLabel("白鸽");
//获取图片地址
URL imgurl = ImageIconDemo.class.getResource("tx.jpg");//通过这个类获取当前文件夹内同级资源
ImageIcon imageIcon = new ImageIcon(imgurl);
label.setIcon(imageIcon); //标签设置
label.setHorizontalAlignment(SwingConstants.CENTER); //剧中显示
Container container = getContentPane();
container.add(label);
this.setVisible(true);
this.setBounds(100,100,600,500);
this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new ImageIconDemo();
}
}
按钮
JButton button = new JButton(text)
butto.setBounds() //设置绝对定位,相对于容器
图片按钮
URL url = JButtonText.class.getResource("tx.jpg");
Icon icon = new ImageIcon(url);
//把这个图标放在按钮伤感
JButton button1 = new JButton();
button1.setIcon(icon); //设置按钮图标
button1.setToolTipText("提示"); //鼠标放上去的提示
单选按钮
//单选框
JRadioButton radioButton01 = new JRadioButton("按钮01");
JRadioButton radioButton02 = new JRadioButton("按钮02");
JRadioButton radioButton03 = new JRadioButton("按钮03");
//由于单选框只能选一个所以要分组
ButtonGroup buttonGroup = new ButtonGroup();
buttonGroup.add(radioButton01);
buttonGroup.add(radioButton02);
buttonGroup.add(radioButton03);
container.add(radioButton01,BorderLayout.NORTH);
container.add(radioButton02,BorderLayout.CENTER);
container.add(radioButton03,BorderLayout.SOUTH);
复选按钮(多选)
//多选框
JCheckBox jCheckBox01 = new JCheckBox("按钮01");
JCheckBox jCheckBox02 = new JCheckBox("按钮02");
container.add(jCheckBox01,BorderLayout.SOUTH);
container.add(jCheckBox02,BorderLayout.NORTH);
JDialog弹窗
//弹窗也是一个窗口,默认可以关闭
class MyDialogDemo extends JDialog{
public MyDialogDemo(){
this.setVisible(true); //弹窗可见
this.setBounds(100,100,500,500); //弹窗大小
Container container = this.getContentPane(); //创建容器
container.setLayout(null); //绝对布局
}
}
文本框
JTextField textField01 = new JTextField("hello");
JTextField textField02 = new JTextField("文本",20); // 限定长度
文本域
JTextArea textArea = new JTextArea(20,50); //每行每列能写的数字
JScrollPane scrollPane = new JScrollPane(jTextArea); //将文本域添加进入滚动条面板中
textArea,setText("文本"); //设置文本
密码框
JPasswordField passwordField = new JPasswordField();//***
passwordField.setEchoChar('*'); //设置显示内容
列表
下拉框
JComboBox combobox = new JComboBox(); //新建列表
combobox.addItem("选项1");
combobox.addItem("选项2");
combobox.addItem("选项3");
combobox.addItem("选项4");
container.add(status);
列表框
//生成列表内容
String[] contents = {"1","2","3"};
//列表中需要放内容
JList jList = new JList(contents);
container.add(jList);
应用场景:
- 选择地区,或者一些单个选项
- 列表, 展示信息,一般是动态扩容
贪吃蛇游戏设计
帧——就是影像动画中最小单位的单幅影像画面,相当于电影胶片上的每一格镜头。 一帧就是一幅静止的画面,连续的帧就形成动画,如电视图象等。 我们通常说帧数,简单地说,就是在1秒钟时间里传输的图片的帧数,也可以理解为图形处理器每秒钟能够刷新几次,通常用fps(Frames Per Second)表示。
在原始基础上添加了无敌
主启动类
package Snake;
import javax.swing.*;
import java.awt.*;
//游戏的主启动类
public class StartGame {
public void init(){
JFrame frame = new JFrame("白鸽的贪吃蛇~");
frame.add(new GamePanel());
frame.setVisible(true);
frame.setBounds(100,100,915, 745);
frame.setResizable(false); //窗口大小不可变
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
}
public static void main(String[] args) {
new StartGame().init();
}
}
游戏面板
package Snake;
import com.sun.org.apache.bcel.internal.generic.SWITCH;
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.Random;
//游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener { //键盘监听接口,定时器接口
int gamePanelWidth = 850; //游戏面板宽度
int gamePanelHeight = 600; //游戏面板高度
//定义蛇的数据结构
int length; //蛇的长度
boolean waiG; //外挂
int[] snakeX = new int[600]; //蛇的x坐标
int[] snakeY = new int[500]; //蛇的y坐标
int Integral = 0; //积分
String fx; //初始化方向
boolean isFail = false; //游戏是否失败状态
//食物的坐标
int foodX;
int foodY;
Random random = new Random();
Timer timer = new Timer(100,this); //定时器 100ms执行一次
//构造器
public GamePanel() {
initLocation();
//获得焦点和键盘事件
this.setFocusable(true); //获得焦点事件
this.addKeyListener(this); //获得键盘监听事件
timer.start(); //游戏开始定时器开启
}
//游戏状态
boolean isStart = false; //默认未开启
//初始化蛇
public void initLocation(){
length = 3; //初始长度为三节
snakeX[0] = 100;snakeY[0] = 100; //蛇头坐标
snakeX[1] = 75;snakeY[1] = 100; //第一个身体坐标
snakeX[2] = 50;snakeY[2] = 100; //第二个身体坐标
fx = "R"; //初始化方向向右
//把食物随机分布
foodX = 25+25*random.nextInt(34);
foodY = 75+25*random.nextInt(24);
Integral = 0; //初始积分为0
waiG = false; //默认外挂未开启
}
//绘制面板,画组件,游戏中的所有东西这个画笔来画出来
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g); //清屏
//绘制静态面板
this.setBackground(Color.WHITE);
//计分面板
g.fillRect( 25, 11,850,50);
//游戏面板
g.fillRect(25,75,gamePanelWidth,gamePanelHeight);
//画食物
Data.food.paintIcon(this,g,foodX,foodY);
//画积分榜单
g.setColor(Color.WHITE);
g.setFont(new Font("微软雅黑",Font.BOLD,35)); //字体 样式 大小
g.drawString("长度:"+length,40,47);
g.setFont(new Font("微软雅黑",Font.BOLD,35)); //字体 样式 大小
g.drawString("积分:"+Integral,300,47);
//把小蛇画上去,蛇头初始化向右,需要通过方向判断
switch (fx) {
case "R": Data.right.paintIcon(this, g, snakeX[0], snakeY[0]);break; //画在哪个组件,用什么画,坐标
case "L": Data.left.paintIcon(this, g, snakeX[0], snakeY[0]);break; //画在哪个组件,用什么画,坐标
case "U": Data.up.paintIcon(this, g, snakeX[0], snakeY[0]);break; //画在哪个组件,用什么画,坐标
case "D": Data.down.paintIcon(this, g, snakeX[0], snakeY[0]);break; //画在哪个组件,用什么画,坐标
}
//身体从第一节开始变化,小于身体长度
for (int i = 1; i < length; i++) {
Data.body.paintIcon(this,g,snakeX[i],snakeY[i]); //画在哪个组件,用什么画,坐标
}
//游戏状态
if (isStart == false){
g.setColor(Color.WHITE);
//设置字体
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //字体 样式 大小
g.drawString("按下空格开始游戏~",270,300); //文本 坐标
g.drawString("按X开启外挂",320,350); //文本 坐标
}
if (waiG){
g.setColor(Color.RED);
g.setFont(new Font("微软雅黑",Font.BOLD,35));
g.drawString("外挂已开启!!!",600,47);
}else {
g.setColor(Color.white);
g.setFont(new Font("微软雅黑",Font.BOLD,35));
g.drawString("外挂暂未开启",600,47);
}
if(isFail){
g.setColor(Color.RED);
//设置字体
g.setFont(new Font("微软雅黑",Font.BOLD,40)); //字体 样式 大小
g.drawString("失败,按下空格重新开始",220,300);
}
}
//键盘按下监听
@Override
public void keyPressed(KeyEvent e) {
int KeyCode = e.getKeyCode(); //获取按下键值
if (KeyCode == KeyEvent.VK_SPACE){ //按下空格开始游戏
if(isFail){
//重新开始
isFail=false;
initLocation();
}else {
isStart=!isStart;//取反操作控制游戏状态
}
repaint(); //值已经变化重新绘制
}
//小蛇移动
switch (KeyCode){
case KeyEvent.VK_UP: fx="U"; break;
case KeyEvent.VK_DOWN: fx="D"; break;
case KeyEvent.VK_LEFT: fx="L"; break;
case KeyEvent.VK_RIGHT: fx="R"; break;
case KeyEvent.VK_X: waiG=!waiG;break; //小蛇无敌
}
}
//事件监听---需要通过固定事件米刷新,1s~10次
@Override
public void actionPerformed(ActionEvent e) {
if (isStart && isFail==false){ //如果游戏是开始的状态,就让小蛇动起来
//吃食物
if (snakeX[0]==foodX&&snakeY[0]==foodY) {
length++; //长度+1
Integral+=5; //没吃一个食物 积分+5
//再次随机食物
foodX = 25+25*random.nextInt(34);
foodY = 75+25*random.nextInt(24);
}
//移动
for (int i = length-1; i > 0 ; i--) {
snakeX[i] = snakeX[i-1]; //向前移动一节
snakeY[i] = snakeY[i-1];
}
//走向
switch (fx){
case "R":snakeX[0]=snakeX[0]+25; if (snakeX[0]>850){snakeX[0]=25;}break;//蛇肉向右移动
case "L":snakeX[0]=snakeX[0]-25; if (snakeX[0]<25){snakeX[0]=850;}break;//蛇肉向左移动
case "U":snakeY[0]=snakeY[0]-25; if (snakeY[0]<75){snakeY[0]=650;}break;//蛇肉向右移动
case "D":snakeY[0]=snakeY[0]+25; if (snakeY[0]>650){snakeY[0]=75;}break;//蛇肉向右移动
}
//失败判定,撞到自己就算失败
for (int i = 1; i < length ;i++) {
if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
isFail = !waiG;
}
}
repaint(); //重画页面
}
timer.start();
}
@Override
public void keyReleased(KeyEvent e) {
}
@Override
public void keyTyped(KeyEvent e) {
}
}
数据类
package Snake;
import javax.swing.*;
import java.net.URL;
//素材数据中心
public class Data {
//绝对路径 相当于当前的顶目
//上下左右
public static URL upURL = Data.class.getResource("material/up.png");
public static URL downURL = Data.class.getResource("material/down.png");
public static URL leftURL = Data.class.getResource("material/left.png");
public static URL rightURL = Data.class.getResource("material/right.png");
public static ImageIcon up = new ImageIcon(upURL);
public static ImageIcon down = new ImageIcon(downURL);
public static ImageIcon left = new ImageIcon(leftURL);
public static ImageIcon right = new ImageIcon(rightURL);
//身体
public static URL bodyURL = Data.class.getResource("material/body.png");
public static ImageIcon body = new ImageIcon(bodyURL);
//食物
public static URL foodURL = Data.class.getResource("material/food.png");
public static ImageIcon food = new ImageIcon(foodURL);
}
游戏实图
本篇笔记学习视频来自b站**【狂神说Java】GUI编程入门到游戏实战**