2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > GUI(图形用户接口)

GUI(图形用户接口)

时间:2023-10-14 22:51:03

相关推荐

GUI(图形用户接口)

AWT

1、包含了很多类和接口!GUI

2、AWT有很对元素:窗口,按钮,文本框

组件和容器

Frame

package com.daihan.lesson1;import java.awt.*;//学习gui的第一个界面public class TestFrame {public static void main(String[] args) {//frameFrame frame=new Frame("first java GUI");//需要设置可见性frame.setVisible(true);//设置窗口大小frame.setSize(400,400);//设置背景颜色 Color类frame.setBackground(Color.CYAN);//自定义颜色//frame.setBackground(new Color(1,1,1));//弹出的初始位置frame.setLocation(200,200);//设置大小固定frame.setResizable(false);}}

存在问题:窗口关不掉,只能停止java运行

封装之后,new 窗口。

package com.daihan.lesson1;import java.awt.*;public class TestFrame2 {public static void main(String[] args) {MyFrame myFrame1=new MyFrame(100,100,200,200,Color.cyan);MyFrame myFrame2=new MyFrame(300,100,200,200,Color.yellow);MyFrame myFrame3=new MyFrame(100,300,200,200,Color.blue);MyFrame myFrame4=new MyFrame(300,300,200,200,Color.gray);}}class MyFrame extends Frame{static int id=0;//可能存在多个id,需要计数器public MyFrame(int x, int y,int w,int h,Color color) throws HeadlessException {super("MyFrame"+(++id));setBackground(color);setVisible(true);//设置位置和大小setBounds(x,y,w,h);}}

面板Panel

package com.daihan.lesson1;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;//Panel可以看作一个空间,不能单独存在public class TestPanel {public static void main(String[] args) {Frame frame=new Frame();//布局的概念Panel panel=new Panel();//设置布局frame.setLayout(null);//坐标frame.setBounds(300,300,500,500);frame.setBackground(new Color(22, 147, 11));//panel设置坐标,相对framepanel.setBounds(50,50,400,400);panel.setBackground(new Color(231, 126, 126));//panel放进frameframe.add(panel);//设置可见性frame.setVisible(true);//监听事件,监听窗口关闭事件 System.exit()//适配器模式:frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}

布局管理器 Layout

流式布局

package com.daihan.lesson1;import java.awt.*;public class TestFlowLayout {public static void main(String[] args) {Frame frame=new Frame();//按钮组件Button button1 = new Button("button1");Button button2 = new Button("button2");Button button3 = new Button("button3");//设置为流式布局,默认居中//frame.setLayout(new FlowLayout());//设置为在左//frame.setLayout(new FlowLayout(FlowLayout.LEFT));//设置为在右frame.setLayout(new FlowLayout(FlowLayout.RIGHT));frame.setSize(200,200);frame.setVisible(true);//把按钮添加上去frame.add(button1);frame.add(button2);frame.add(button3);}}

东西南北中布局BorderLayout

这个不需要.setLayout()方法

package com.daihan.lesson1;import java.awt.*;public class TestBorderLayout {public static void main(String[] args) {Frame frame = new Frame("Test Border Layout");Button east = new Button("east");Button west = new Button("west");Button north = new Button("north");Button south = new Button("south");Button center = new Button("center");frame.add(east,BorderLayout.EAST);frame.add(west,BorderLayout.WEST);frame.add(north,BorderLayout.NORTH);frame.add(south,BorderLayout.SOUTH);frame.add(center,BorderLayout.CENTER);frame.setVisible(true);frame.setBounds(200,200,500,500);}}

表格布局GridLayout

package com.daihan.lesson1;import java.awt.*;public class TestGridLayout {public static void main(String[] args) {Frame frame=new Frame("Grid Frame");Button btn1 = new Button("btn1");Button btn2 = new Button("btn2");Button btn3 = new Button("btn3");Button btn4 = new Button("btn4");Button btn5 = new Button("btn5");Button btn6 = new Button("btn6");//三行两列frame.setLayout(new GridLayout(3,2));//添加按钮frame.add(btn1);frame.add(btn2);frame.add(btn3);frame.add(btn4);frame.add(btn5);frame.add(btn6);//自动布局frame.pack();//设置可见性frame.setVisible(true);}}

事件监听

当某个事件发生的时候,干什么?

package com.daihan.lesson2;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 TestActionEvent {public static void main(String[] args) {//按下按钮触发事件Frame frame = new Frame();Button button = new Button();//因为addActionListener()需要一个ActionListener,所以构造ActionListenerMyActionListener myActionListener = new MyActionListener();button.addActionListener(myActionListener);//button放入frameframe.add(button,BorderLayout.CENTER);//自适应大小frame.pack();frame.setVisible(true);windowClose(frame);}//关闭窗口事件//事件监听private static void windowClose(Frame frame){frame.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);}});}}//点击按钮,输出 aclass MyActionListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {System.out.println("a");}}

多个按钮共享一个事件

package com.daihan.lesson2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class TestActionListener {public static void main(String[] args) {//两个按钮 实现同一监听//开始-结束Frame frame= new Frame("开始-结束");Button startBtn = new Button("start");Button stopBtn = new Button("stop");//可以显式定义触发事件 返回的值,不显式定义则返回默认值(label对应的值)stopBtn.setActionCommand("stopBtn");MyMonitor myMonitor = new MyMonitor();startBtn.addActionListener(myMonitor);stopBtn.addActionListener(myMonitor);frame.add(startBtn,BorderLayout.WEST);frame.add(stopBtn,BorderLayout.EAST);frame.pack();frame.setVisible(true);}}class MyMonitor implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {//e.getActionCommand();获取按钮信息System.out.println("按钮被点击了"+e.getActionCommand());if(e.getActionCommand().equals("startBtn")){}}}

输入框TextField 监听

package com.daihan.lesson2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;public class TestText1 {public static void main(String[] args) {//启动new MyFrame();}}class MyFrame extends Frame{public MyFrame(){TextField textField = new TextField();add(textField);//监听文本框输入的文字//按下回车 就会触发输入框textField.addActionListener(new MyActionListener2());//设置替换编码textField.setEchoChar('*');setVisible(true);pack();}}class MyActionListener2 implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {TextField field= (TextField) e.getSource();//获得资源,返回对象field.getText();//获得输入框中的文本System.out.println(field.getText());field.setText("");}}

计算器

第一版,面向过程

package com.daihan.lesson2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;//简易计算器public class TestCalculate {public static void main(String[] args) {new Calculator();}}//计算器类class Calculator extends Frame{public Calculator() throws HeadlessException {//三个文本框,参数为最大填入字符数TextField num1 = new TextField(10);TextField num2 = new TextField(10);TextField num3 = new TextField(20);//一个按钮Button button = new Button("=");//绑定监听事件button.addActionListener(new MyCalculatorListener(num1,num2,num3));//一个标签Label label = new Label("+");//布局setLayout(new FlowLayout());add(num1);add(label);add(num2);add(button);add(num3);//可见性setVisible(true);pack();}}//监听器类class MyCalculatorListener implements ActionListener{//获取三个变量private TextField num1,num2,num3;public MyCalculatorListener(TextField num1 ,TextField num2 ,TextField num3 ) {this.num1=num1;this.num2=num2;this.num3=num3;}@Overridepublic void actionPerformed(ActionEvent e) {//1、获得加数和被加数int n1 = Integer.parseInt(num1.getText());int n2 = Integer.parseInt(num2.getText());//2、将这两个值进行运算后放到第三个框num3.setText(""+(n1+n2));//3、清除前两个框num1.setText("");num2.setText("");}}

问题:监听器类中private TextField num1,num2,num3;不好,传参麻烦

第二版,运用组合,完全面向对象oop

package com.daihan.lesson2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;//简易计算器public class TestCalculate {public static void main(String[] args) {new Calculator().loadFrame();}}//计算器类class Calculator extends Frame{//属性TextField num1,num2,num3;//方法public void loadFrame(){//三个文本框,参数为最大填入字符数num1 = new TextField(10);num2 = new TextField(10);num3 = new TextField(20);//一个按钮Button button = new Button("=");//绑定监听事件button.addActionListener(new MyCalculatorListener(this));//一个标签Label label = new Label("+");//布局setLayout(new FlowLayout());add(num1);add(label);add(num2);add(button);add(num3);//可见性setVisible(true);pack();}}//监听器类class MyCalculatorListener implements ActionListener{//获取三个变量private Calculator calculator=null;public MyCalculatorListener(Calculator calculator) {this.calculator=calculator;}@Overridepublic void actionPerformed(ActionEvent e) {//1、获得加数和被加数int n1=Integer.parseInt(calculator.num1.getText());int n2=Integer.parseInt(calculator.num2.getText());//2、将这两个值进行运算后放到第三个框calculator.num3.setText(""+(n1+n2));//3、清除前两个框}}

第三版,内部类,更好的包装

package com.daihan.lesson2;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;//简易计算器public class TestCalculate {public static void main(String[] args) {new Calculator().loadFrame();}}//计算器类class Calculator extends Frame{//属性TextField num1,num2,num3;//方法public void loadFrame(){//三个文本框,参数为最大填入字符数num1 = new TextField(10);num2 = new TextField(10);num3 = new TextField(20);//一个按钮Button button = new Button("=");//绑定监听事件button.addActionListener(new MyCalculatorListener());//一个标签Label label = new Label("+");//布局setLayout(new FlowLayout());add(num1);add(label);add(num2);add(button);add(num3);//可见性setVisible(true);pack();}//内部类 监听器类//内部类最大的好出就是畅通无阻的访问外部类的属性和方法private class MyCalculatorListener implements ActionListener{@Overridepublic void actionPerformed(ActionEvent e) {//1、获得加数和被加数int n1=Integer.parseInt(num1.getText());int n2=Integer.parseInt(num2.getText());//2、将这两个值进行运算后放到第三个框num3.setText(""+(n1+n2));//3、清除前两个框}}}

画笔

重写Frame类的public void paint(Graphics g) {...}方法

package com.daihan.lesson3;import java.awt.*;public class TestPaint {public static void main(String[] args) {new MyPaint().loadFrame();}}class MyPaint extends Frame {public void loadFrame(){setVisible(true);setBounds(200,200,600,500);}//画笔@Overridepublic void paint(Graphics g) {//画笔,需要有颜色,画笔可以画画g.setColor(Color.red);g.drawOval(100,100,100,100);//空心圆g.fillOval(100,100,100,100);//实心圆g.setColor(Color.green);g.fillRect(200,200,100,100);//养成习惯,画笔用完,还原最初颜色--黑色g.setColor(Color.black);}}

鼠标监听

目的:想要实现鼠标画画

package com.daihan.lesson3;import java.awt.*;import java.awt.event.MouseAdapter;import java.awt.event.MouseEvent;import java.util.ArrayList;import java.util.Iterator;public class TestMouseListener {public static void main(String[] args) {new MyFrame("drawing");}}class MyFrame extends Frame{//画画需要画笔,需要监听鼠标当前的位置,需要集合来存储画下来的点//存点集合ArrayList points;public MyFrame(String title) {super(title);setBounds(200,200,400,400);//存鼠标点击的位置points=new ArrayList();//鼠标监听器,针对这个窗口this.addMouseListener(new MyMouserListener());//可见性setVisible(true);//初始大小setBounds(100,100,500,500);}@Overridepublic void paint(Graphics g) {//画画需要监听鼠标事件Iterator iterator = points.iterator();while(iterator.hasNext()){Point p= (Point) iterator.next();g.setColor(Color.blue);g.fillOval(p.x,p.y,10,10);}}//添加一个点到界面上public void addPaint(Point point){points.add(point);}//内部类,适配器模式private class MyMouserListener extends MouseAdapter{//鼠标按下,弹起,按住不放@Overridepublic void mousePressed(MouseEvent e) {MyFrame myFrame= (MyFrame) e.getSource();//这里点击的时候,界面会产生一个点//这个点就是鼠标的点myFrame.addPaint(new Point(e.getX(),e.getY()));//每次点击都会重画myFrame.repaint();//刷新页面}}}

窗口监听

关闭事件

package com.daihan.lesson3;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class TestWindow {public static void main(String[] args) {new WindowFrame();}}class WindowFrame extends Frame{public WindowFrame() {setBackground(new Color(212, 104, 104));setBounds(100,100,500,500);setVisible(true);//addWindowListener(new MyWindowListrner());//匿名内部类this.addWindowListener(new WindowAdapter() {@Overridepublic void windowClosing(WindowEvent e) {System.out.println("closing...");System.exit(0);//正常退出}});}class MyWindowListrner extends WindowAdapter{@Overridepublic void windowClosing(WindowEvent e) {System.exit(0);//正常退出//setVisible(false);//隐藏窗口,通过按钮隐藏窗口}}}

其他事件

package com.daihan.lesson3;import java.awt.*;import java.awt.event.WindowAdapter;import java.awt.event.WindowEvent;import java.awt.event.WindowListener;public class TestWindow {public static void main(String[] args) {new WindowFrame();}}class WindowFrame extends Frame{public WindowFrame() {setBackground(new Color(212, 104, 104));setBounds(100,100,500,500);setVisible(true);//addWindowListener(new MyWindowListrner());//匿名内部类this.addWindowListener(new WindowAdapter() {@Overridepublic void windowOpened(WindowEvent e) {System.out.println("window Opened");}@Overridepublic void windowClosing(WindowEvent e) {System.out.println("window Closing");System.exit(0);}@Overridepublic void windowClosed(WindowEvent e) {System.out.println("window Closed");}@Overridepublic void windowActivated(WindowEvent e) {System.out.println("windowActivated");}});}}

键盘监听

package com.daihan.lesson3;import java.awt.*;import java.awt.event.KeyAdapter;import java.awt.event.KeyEvent;public class TestKeyListener {public static void main(String[] args) {new KeyFrame();}}class KeyFrame extends Frame{public KeyFrame() throws HeadlessException {setBounds(100,100,300,300);setVisible(true);addKeyListener(new KeyAdapter() {//键盘按下,触发事件@Overridepublic void keyPressed(KeyEvent e) {//获取键盘按下的是哪一个键,当前的码int keyCode=e.getKeyCode();if(keyCode==KeyEvent.VK_UP){System.out.println("按的up键");}//根据按下不同键,执行不同命令}});}}

SWING

窗口

package com.daihan.lesson4;import javax.swing.*;import java.awt.*;public class JFrameDome {public static void main(String[] args) {//建立一个窗口new JFrameDome().init();}//init() ;初始化public void init() {//顶级窗口JFrame jf = new JFrame("这是一个JFrame");//设置可见性jf.setVisible(true);//设置大小jf.setBounds(100,100,200,200);//设置背景,jf.setBackground(Color.lightGray);//设置文字 JLabelJLabel label = new JLabel("欢迎来到123");//加入jf.add(label);//容器。容器实例化//关闭事件jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}}

关闭事件

jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

弹窗

package com.daihan.lesson4;import javax.swing.*;import java.awt.*;import java.awt.event.ActionEvent;import java.awt.event.ActionListener;//主窗口public class DialogDemo extends JFrame {public DialogDemo(){setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//JFrame 放东西 需要容器Container container=getContentPane();//绝对布局container.setLayout(null);//按钮JButton button = new JButton("点击弹出对话框");button.setBounds(30,30,200,50);//加入容器container.add(button);//点击按钮,弹出一个弹窗button.addActionListener(new ActionListener() {//监听器@Overridepublic void actionPerformed(ActionEvent e) {//弹窗new MyDialogDemo();}});}public static void main(String[] args) {new DialogDemo();}}//弹窗窗口class MyDialogDemo extends JDialog{public MyDialogDemo() {setVisible(true);setBounds(100,100,500,500);//setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);Container container=getContentPane();container.setLayout(null);container.add(new Label("学Java"));}}

标签

labelnew JLabel("xxx")

icon

package com.daihan.lesson4;import javax.swing.*;import java.awt.*;import .URL;public class ImageIconDemo extends JFrame {public static void main(String[] args) {new ImageIconDemo();}public ImageIconDemo() {JLabel label = new JLabel("ImageIconDemo");//获取图片地址//通过类获取当前类路径下的东西URL url= ImageIconDemo.class.getResource("Porsche.jpg");ImageIcon imageIcon = new ImageIcon(url);label.setIcon(imageIcon);label.setHorizontalAlignment(SwingConstants.CENTER);Container container = getContentPane();container.add(label);setVisible(true);pack();setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}}

面板

JPanel

package com.daihan.lesson5;import javax.swing.*;import java.awt.*;public class JPanelDemo extends JFrame {public JPanelDemo() throws HeadlessException {Container container = getContentPane();//设置布局,后俩个参数为间距container.setLayout(new GridLayout(2,1,10,10));JPanel panel1 = new JPanel(new GridLayout(1, 3));panel1.add(new JButton("111"));panel1.add(new JButton("222"));panel1.add(new JButton("333"));container.add(panel1);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JPanelDemo();}}

滚动面板JScroll

package com.daihan.lesson5;import javax.swing.*;import java.awt.*;public class JScrollDemo extends JFrame {public JScrollDemo() throws HeadlessException {Container container = getContentPane();//文本域,可换行JTextArea textArea = new JTextArea(20, 20);textArea.setText("welcome to java");//Scroll面板JScrollPane scrollPane = new JScrollPane(textArea);container.add(scrollPane);setVisible(true);setSize(500,500);setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);}public static void main(String[] args) {new JScrollDemo();}}

按钮

图片按钮

package com.daihan.lesson5;import javax.swing.*;import java.awt.*;import .URL;public class JButtonDemo extends JFrame {public JButtonDemo() throws HeadlessException {Container container = getContentPane();//将图片变为图标//URL url = JButtonDemo.class.getResource("Porsche.jpg");Icon icon = new ImageIcon("D:\\JAVACODE\\GUI\\AWT\\src\\com\\daihan\\lesson5\\Porsche.jpg");//把这个图标放在按钮上JButton button = new JButton();button.setIcon(icon);//设置鼠标悬浮提示button.setToolTipText("图片按钮");container.add(button);setVisible(true);setSize(200,200);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo();}}

单选

package com.daihan.lesson5;import javax.swing.*;import java.awt.*;public class JButtonDemo2 extends JFrame {public JButtonDemo2() throws HeadlessException {Container container = getContentPane();//单选框JRadioButton radioButton01 = new JRadioButton("JRadioButton01");JRadioButton radioButton02 = new JRadioButton("JRadioButton02");JRadioButton radioButton03 = new JRadioButton("JRadioButton03");JRadioButton radioButton04 = new JRadioButton("JRadioButton04");//由于单选框单选框只能选择一个,所以会分组//单选在一个组只能选择一个ButtonGroup group = new ButtonGroup();group.add(radioButton01);group.add(radioButton02);group.add(radioButton03);group.add(radioButton04);//布局container.add(radioButton01,BorderLayout.CENTER);container.add(radioButton02,BorderLayout.NORTH);container.add(radioButton03,BorderLayout.SOUTH);setVisible(true);setSize(200,200);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo2();}}

复选

package com.daihan.lesson5;import javax.swing.*;import java.awt.*;import java.nio.ByteOrder;public class JButtonDemo3 extends JFrame{public JButtonDemo3() throws HeadlessException {Container container = getContentPane();//多选框JCheckBox checkBox1 = new JCheckBox("checkbox1");JCheckBox checkBox2 = new JCheckBox("checkbox2");JCheckBox checkBox3 = new JCheckBox("checkbox3");//放入容器container.add(checkBox1,BorderLayout.NORTH);container.add(checkBox2,BorderLayout.CENTER);container.add(checkBox3,BorderLayout.SOUTH);setVisible(true);setSize(200,200);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new JButtonDemo3();}}

列表

下拉框

package com.daihan.lesson6;import javax.swing.*;import java.awt.*;public class TestComboboxDemo1 extends JFrame {public TestComboboxDemo1() throws HeadlessException {Container container = getContentPane();//下拉框JComboBox status = new JComboBox();status.addItem(null);status.addItem("正在上映");status.addItem("已下映");status.addItem("即将上映");container.add(status);setVisible(true);setSize(300,400);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new TestComboboxDemo1();}}

列表框

package com.daihan.lesson6;import javax.swing.*;import java.awt.*;public class TestComboboxDemo2 extends JFrame{public TestComboboxDemo2() throws HeadlessException {Container container = getContentPane();//生成列表的内容String[] contents={"1","2","3"};//列表中需要内容JList<Object> jlist = new JList<>(contents);container.add(jlist);setVisible(true);setSize(300,400);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new TestComboboxDemo2();}}

应用场景

下拉框用在选择地区,或则一些单个选项

列表用在展示信息,动态扩容

文本框

文本框

package com.daihan.lesson6;import javax.swing.*;import java.awt.*;public class TestTextDemo1 extends JFrame {public TestTextDemo1() throws HeadlessException {Container container = getContentPane();JTextField textField1 = new JTextField("hello1");JTextField textField2 = new JTextField("hello2");container.add(textField1,BorderLayout.NORTH);container.add(textField2,BorderLayout.SOUTH);setSize(200,200);setVisible(true);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new TestTextDemo1();}}

密码框

package com.daihan.lesson6;import javax.swing.*;import java.awt.*;public class TestTextDemo3 extends JFrame {public TestTextDemo3() throws HeadlessException {Container container = getContentPane();JPasswordField passwordField = new JPasswordField();passwordField.setEchoChar('*');container.add(passwordField);setSize(200,200);setVisible(true);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);}public static void main(String[] args) {new TestTextDemo3();}}

文本域

定时器Timer

在class结构定义的时候声明使用定时器

//定时器Timer timer=new Timer(100,this);//100ms刷新一次

在使用的地方启动

timer.start();//游戏开始,定时器启动

综合示例 贪吃蛇

Data类

package com.daihan.snake;import javax.swing.*;import .URL;//数据中心public class Data {//相对路径 xx.jpg//绝对路径 / 相当于当前项目public static URL headerURL=Data.class.getResource("statics/header.png");public static ImageIcon header=new ImageIcon(headerURL);//头部图片public static URL upURL=Data.class.getResource("statics/up.png");public static URL downURL=Data.class.getResource("statics/down.png");public static URL leftURL=Data.class.getResource("statics/left.png");public static URL rightURL=Data.class.getResource("statics/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("statics/body.png");public static ImageIcon body=new ImageIcon(bodyURL);//食物public static URL foodURL=Data.class.getResource("statics/food.png");public static ImageIcon food=new ImageIcon(foodURL);}

画板类

package com.daihan.snake;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 length;//蛇的坐标int[] snakeX=new int[600];int[] snakeY=new int[500];//蛇的方向String fx;//游戏状态:开始、停止boolean isStart=false;//默认停止状态//游戏失败判定boolean isFail=false;//默认游戏状态失败//食物坐标int foodX;int foodY;Random random=new Random();//积分int score;//定时器Timer timer=new Timer(100,this);//100ms刷新一次//构造器public GamePanel() {init();//获得焦点和键盘事件this.setFocusable(true);this.addKeyListener(this);//获得键盘监听事件}//初始化方法public void init(){length=3;snakeX[0]=100;snakeY[0]=100;//头坐标snakeX[1]=75;snakeY[1]=100;//第一节身体坐标snakeX[2]=50;snakeY[2]=100;//第二节身体坐标fx="R";//初始方向向右timer.start();//游戏开始,定时器启动//食物随机分布foodX=25+25*random.nextInt(34);foodY=75+25*random.nextInt(24);//积分初始化score=0;}//绘制面板,游戏中所有东西,都是使用这个画笔来画@Overrideprotected void paintComponent(Graphics g) {super.paintComponent(g);//清屏//绘制静态面板setBackground(Color.LIGHT_GRAY);//头部广告栏Data.header.paintIcon(this,g,25,11);//主体矩形,默认游戏界面g.fillRect(25,75,850,600);//把小蛇画上//需要通过方向来判断蛇头朝向if("R".equals(fx)){Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右}else if("L".equals(fx)){Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右}else if("D".equals(fx)){Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右}else if("U".equals(fx)){Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头初始化向右}for(int i=1;i<length;i++) {Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);}//画食物Data.food.paintIcon(this,g,foodX,foodY);//游戏状态if(!isStart){//设置文字颜色g.setColor(Color.WHITE);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("按下空格开始",300,300);}//游戏失败if(isFail){//设置文字颜色g.setColor(Color.RED);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,40));g.drawString("游戏失败,按下空格重新开始",300,300);}//积分//设置文字颜色g.setColor(Color.WHITE);//设置字体g.setFont(new Font("微软雅黑",Font.BOLD,18));g.drawString("长度:"+length,750,35);g.drawString("积分:"+score,750,55);}//键盘监听事件@Overridepublic void keyPressed(KeyEvent e) {int keyCode = e.getKeyCode();//获得键盘事件//如果按下空格就能动起来if(e.getKeyCode()==KeyEvent.VK_SPACE){if(isFail) {//重新开始isFail=false;init();}else{isStart = !isStart;}//重绘repaint();}//小蛇移动if(keyCode==KeyEvent.VK_UP){fx="U";}else if(keyCode==KeyEvent.VK_DOWN){fx="D";}else if(keyCode==KeyEvent.VK_LEFT){fx="L";}else if(keyCode==KeyEvent.VK_RIGHT){fx="R";}}//事件监听--通过固定事件刷新,1秒10次@Overridepublic void actionPerformed(ActionEvent e) {if(isStart&&(!isFail)) {//如果游戏是开始状态,就让小蛇动起来//吃食物if(snakeX[0]==foodX&&snakeY[0]==foodY){//蛇长度+1length++;//分数+1score++;//再次随机生成食物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];}//走向if("R".equals(fx)) {snakeX[0] = snakeX[0] + 25;//边界判断if(snakeX[0]>850){snakeX[0]=25;}}else if("L".equals(fx)){snakeX[0] = snakeX[0] - 25;if(snakeX[0]<25){snakeX[0]=850;}}else if("U".equals(fx)){snakeY[0] = snakeY[0] - 25;if(snakeY[0]<75){snakeY[0]=650;}}else if("D".equals(fx)){snakeY[0] = snakeY[0] + 25;if(snakeY[0]>650){snakeY[0]=75;}}//失败事件,判定:撞到自己for(int i=1;i<length;i++){if(snakeX[0]==snakeX[i]&&snakeY[0]==snakeY[i]) {isFail = true;break;}}//重绘repaint();}timer.start();}@Overridepublic void keyReleased(KeyEvent e) {}@Overridepublic void keyTyped(KeyEvent e) {}}

主程序

package com.daihan.snake;import javax.swing.*;//游戏的主启动类public class StartGame {public static void main(String[] args) {JFrame frame = new JFrame();frame.setBounds(10,10,900,720);frame.setResizable(false);//窗口大小不可变frame.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);//正常的游戏界面都应该在面板上frame.add(new GamePanel());frame.setVisible(true);}}

疑问:定时器原理和使用

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。