GUI编程(附贪吃蛇代码)

GUI编程

组件

  • 窗口
  • 弹窗
  • 面板
  • 文本框
  • 列表框
  • 按钮
  • 图片
  • 监听事件
  • 鼠标
  • 键盘事件
  • 破解工具

1.简介

GUI的核心技术:Swing AWT

1.因为界面不美观

2.需要JRE 环境

为什么我们要学习?

  1. 可以写小工具
  2. 了解MVC架构,了解监听

2.AWT

1.介绍

  • 包含了很多类和接口

  • 元素 窗口

2.Frame

setsize()

setLocation()

SetBackground()

set.Layout

3.Panel

不能单独存在,可以看作一个空间

4.布局管理器

  • 流式
  • 东西南北中
  • 表格布局

5.事件监听

要建立一个ActionListener类, 然后Button.add(ActionListener).

6.输入框 TextField 监听

image-20240104094739237

7.简易计算器

1.目前代码

public class TestCalc {
    public static void main(String[] args) {
    new Calculator();
    }
}

//计算机类
class Calculator extends Frame{
    public Calculator(){
        TextField num1 = new TextField(10);
        TextField num2 = new TextField(10);
        TextField num3 = new TextField(10);

        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);

        pack();
        setVisible(true);
    }
}

//监听器类
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;
    }
    @Override
    public void actionPerformed(ActionEvent e) {
        //获得加数和被加数
        int n1=Integer.parseInt(num1.getText());
        int n2=Integer.parseInt(num2.getText());

        num3.setText(""+(n1+n2));
        num1.setText("");
        num2.setText("");
    }
}

2.内部类

public class TestCalc {
    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(10);
        Button button = new Button("=");
        //一个标签
        Label label = new Label("+");
        button.addActionListener(new MyCalculatorListener());
        //布局
        setLayout(new FlowLayout());
        add(num1);
        add(label);
        add(num2);
        add(button);
        add(num3);

        pack();
        setVisible(true);
        addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
    private class MyCalculatorListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent e) {
            //获得加数和被加数
            int n1=Integer.parseInt(num1.getText());
            int n2=Integer.parseInt(num2.getText());

            num3.setText(""+(n1+n2));
            num1.setText("");
            num2.setText("");
        }
    }
}

8.画笔

public class TestPaint {
    public static void main(String[] args) {
    new MyPaint().loadFrame();
    }
}

class MyPaint extends Frame{
    public void loadFrame(){
    setBounds(200,200,600,600);
    setVisible(true);
    }
    public void paint(Graphics g){
        //super.paint(g);
        g.setColor(Color.red);
        g.fillOval(100,100,200,200);//实心圆

        g.setColor(Color.BLUE);
        g.fillRect(200,200,100,100);

        //画笔用完要还原原来的颜色
    }
}

9.鼠标监听

public class TestMouseListener {
    public static void main(String[] args) {
    new MyFrame("paint");
    }
}

class MyFrame extends Frame{
    ArrayList points;
    public MyFrame(String title){
        super(title);
        setBounds(200,200,400,300);
        //存鼠标点击的点
        points=new ArrayList();

        setVisible(true);
        //鼠标监听器
        this.addMouseListener(new MyMouseListener());
    }
    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);
    }
    private class MyMouseListener extends MouseAdapter{
        @Override
        public void mousePressed(MouseEvent e) {
            MyFrame frame=(MyFrame) e.getSource();
            //添加点
            frame.addPaint(new Point(e.getX(),e.getY()));

            frame.repaint();//刷新
        }
    }
}

10.窗口监听

public class TestWindow {
    public static void main(String[] args) {
    new WindowFrame();
    }
}

class WindowFrame extends Frame{
    public WindowFrame(){
        setBackground(Color.red);
        setBounds(100,100,200,200);
        setVisible(true);
        //addWindowListener(new MyWindowListener());
        this.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.out.println("WindowClosing");
                System.exit(0);
            }

            @Override
            public void windowActivated(WindowEvent e) {
                WindowFrame sourse=(WindowFrame) e.getSource();
                sourse.setTitle("被激活了");
                System.out.println("windowActivated");
            }
        });
    }

    /*class MyWindowListener extends WindowAdapter{
        @Override
        public void windowClosing(WindowEvent e) {
            setVisible(false);//隐藏窗口
            System.exit(0);//正常退出
        }
    }*/
}

11.键盘监听

public class TestKeyListener {
    public static void main(String[] args) {
        new KeyFrame();
    }
}

class KeyFrame extends Frame{
    public KeyFrame()  {
    setBounds(100,100,200,200);
    setVisible(true);

    this.addKeyListener(new KeyAdapter() {
        @Override
        public void keyPressed(KeyEvent e) {
            //获得键盘按下的键,不需要去记录这个数值,直接使用静态属性
            int keyCode=e.getKeyCode();
            System.out.println(keyCode);
            if(keyCode==KeyEvent.VK_UP){
                System.out.println("你按下了上键");
            }
            if(keyCode==KeyEvent.VK_RIGHT){
                System.out.println("你按下了右键");
            }
        }
    });
    }

}

3.Swing

1.窗口

public class JFrameDemo {
    public  void init(){
        //顶级窗口
        JFrame frame=new JFrame("这个是一个JFrame");
        frame.setVisible(true);
        frame.setBounds(100,100,200,200);
        //设置文字 label
        JLabel label=new JLabel("Welcome");
        frame.add(label);
        //文本水平居中
        label.setHorizontalAlignment(SwingConstants.CENTER);
        //关闭事件
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        //建立一个窗口
        new JFrameDemo().init();
    }
}

2.弹窗

public class DialogDemo extends JFrame {
    public DialogDemo(){
        setVisible(true);
        setSize(500,400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //JFrame 放东西,容器
        Container container=getContentPane();
        //绝对布局
        container.setLayout(null);

        //按钮
        JButton button=new JButton("11111");
        button.setBounds(30,30,200,50);
        //点击这个按钮的时候,弹出一个窗口
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                //弹窗
                new MyDialog();
            }
        });

        container.add(button);
    }
    public static void main(String[] args) {
    new DialogDemo();
    }
}

//弹窗的窗口
class MyDialog extends JDialog{
    public MyDialog(){
        this.setVisible(true);
        this.setBounds(1000,100,500,500);

        Container container=this.getContentPane();
        container.setLayout(null);

        container.add(new Label("welcome to JDialog"));
    }
}

3.标签

label

new JLabel("xxx");

图标 Icon

public class IconDemo extends JFrame implements Icon {
    private int width;
    private int height;

    public IconDemo() throws HeadlessException {
    }

    public IconDemo(int width, int height) throws HeadlessException {
        this.width = width;
        this.height=height;
    }

    public void init(){
        IconDemo iconDemo=new IconDemo(15,15);
        //图标放在标签,也可以放在按钮上
        JLabel label = new JLabel("icocntest", iconDemo, SwingConstants.CENTER);

        Container contentPane = getContentPane();
        contentPane.add(label);

        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 static void main(String[] args) {
    new IconDemo().init();
    }
}

图片 Image

public class ImageIconDemo extends JFrame{
    public ImageIconDemo(){
        //获取图片的地址
        JLabel label = new JLabel("ImageIcon");
        URL url = ImageIconDemo.class.getResource("qq.jpg");

        ImageIcon imageIcon = new ImageIcon(url);//
        label.setIcon( imageIcon);
        label.setHorizontalAlignment(SwingConstants.CENTER);

        Container container=getContentPane();
        container.add(label);

        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        setBounds(100,100,400,400);
    }

    public static void main(String[] args) {
        new ImageIconDemo();
    }
}

4.面板

public class JPanelDemo extends JFrame {
    public JPanelDemo(){
        Container container=this.getContentPane();

        container.setLayout(new GridLayout(2,1,10,10));
        //创建面板
        JPanel panel1=new JPanel(new GridLayout(1,3));
        //添加button
        panel1.add(new JButton("1"));
        panel1.add(new JButton("1"));
        panel1.add(new JButton("1"));

        container.add(panel1);
        this.setVisible(true);
        this.setSize(500,500);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
    public static void main(String[] args) {
        new JPanelDemo();
    }
}

JScrollPanel

public class JScrollDemo extends JFrame {
    public  JScrollDemo(){
        Container contentPane = getContentPane();
        //文本域
        JTextArea textArea=new JTextArea(20,30);
        textArea.setText("王志文你最牛");
        //Scroll 面板
        JScrollPane scrollPane=new JScrollPane(textArea);
        contentPane.add(scrollPane);

        setVisible(true);
        setBounds(100,100,400,400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new JScrollDemo();
    }
}

5.按钮

图片按钮

public class JButtonDemo1 extends JFrame {
    public JButtonDemo1(){
        Container container = this.getContentPane();
        //将一个图片变为图标
        URL resource = JButtonDemo1.class.getResource("qq.jpg");
        Icon icon=new ImageIcon(resource);

        //把这个图片放在按钮上
        JButton button=new JButton();
        button.setIcon(icon);
        button.setToolTipText("图片按钮");

        //add
        container.add(button);
        this.setVisible(true);
        this.setSize(4000,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new JButtonDemo1();
    }
}

单选框

public class JButtonDemo2 extends JFrame{
    public JButtonDemo2(){
        Container container = this.getContentPane();
        //将一个图片变为图标
        URL resource = JButtonDemo1.class.getResource("qq.jpg");
        Icon icon=new ImageIcon(resource);

        //单选框
        JRadioButton button1 = new JRadioButton("Button1");
        JRadioButton button2 = new JRadioButton("Button1");
        JRadioButton button3 = new JRadioButton("Button1");

        ButtonGroup group=new ButtonGroup();
        group.add(button1);
        group.add(button2);
        group.add(button3);
        //add
        container.add(button1,BorderLayout.CENTER);
        container.add(button2,BorderLayout.NORTH);
        container.add(button3,BorderLayout.SOUTH);

        this.setVisible(true);
        this.setSize(4000,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new JButtonDemo2();
    }
}

复选框

package Day3;

import javax.swing.*;
import java.awt.*;
import java.net.URL;

public class JButtonDemo3 extends JFrame{
        public JButtonDemo3(){
            Container container = this.getContentPane();
            //将一个图片变为图标
            URL resource = JButtonDemo1.class.getResource("qq.jpg");
            Icon icon=new ImageIcon(resource);

            //多选框
            JCheckBox checkBox1=new JCheckBox("1");
            JCheckBox checkBox2=new JCheckBox("2");
            //add
            container.add(checkBox1,BorderLayout.CENTER);
            container.add(checkBox2,BorderLayout.NORTH);

            this.setVisible(true);
            this.setSize(4000,400);
            this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        }

        public static void main(String[] args) {
            new Day3.JButtonDemo3();
        }
}

6.列表

下拉框

package Day3;

import javax.swing.*;
import java.awt.*;

/**
 * ClassName: TestComboboxDemo1
 * Description:
 *
 * @author: wzw
 * @create: 2024/1/7 20:18
 */
public class TestComboboxDemo1 extends JFrame {
    public  TestComboboxDemo1(){
        Container container = this.getContentPane();

        JComboBox status=new JComboBox();

        status.addItem(null);
        status.addItem("正在热映");
        status.addItem("已下架");
        status.addItem("即将上映");
        container.add(status);

        this.setVisible(true);
        this.setSize(400,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new TestComboboxDemo1();
    }
}

列表框

package Day3;

import javax.swing.*;
import java.awt.*;

public class TestComboboxDemo2 extends JFrame {
    public  TestComboboxDemo2(){
        Container container = this.getContentPane();

        String[] contents={"1","2","3"};
        JList jList = new JList(contents);

        container.add(jList);

        this.setVisible(true);
        this.setSize(400,400);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new TestComboboxDemo2();
    }
}

7.文本框

文本框,密码框,文本域

public class TestTextDemo1 extends JFrame {
    public TestTextDemo1(){
        Container container = this.getContentPane();
        /*文本框
        JTextField textField = new JTextField("111");
        密码框
        JPasswordField textField = new JPasswordField("mima");

         */
        TextArea textArea = new TextArea(20, 40);
        textArea.setText("wzw");

        container.add(textArea,BorderLayout.SOUTH);

        setVisible(true);
        setSize(400,400);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void main(String[] args) {
        new TestTextDemo1();
    }
}

贪吃蛇

帧,如果时间片足够小,就是动画,拆开就是静态的图片

键盘监听

定时器

主页面

package snake;

import javax.swing.*;
import java.awt.*;

public class StartGame {
    public static void main(String[] args) {
        JFrame frame=new JFrame();
        
        frame.setBounds(500,200,900,720);
        frame.setResizable(false);//窗口大小不可变
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        frame.add(new GamePanel());
        frame.setVisible(true);
    }
}

面板

package 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];// 蛇的x坐标
    int[] snakeY=new int[500];// 蛇的y坐标
    String direction;//方向

    //食物的坐标
    int foodx;
    int foody;
    //游戏当前的状态:开始 停止
    boolean isStart=false;

    //是否失败
    boolean isFail=false;

    //游戏积分
    int score=0;
    //定时器 以ms为单位
    Timer timer=new Timer(100,this);//100毫秒执行一次
    //构造器
    public GamePanel(){
        init();
        this.setFocusable(true);
        this.addKeyListener(this);//获得键盘监听事件
        timer.start();
    }
    //初始化
    public void init(){
        length=3;
        snakeX[0]=150; snakeY[0]=100;
        snakeX[1]=125; snakeY[1]=100;
        snakeX[2]=100; snakeY[2]=100;
        direction="R";
        foodx=25+25*(new Random().nextInt(34));
        foody=75+25*(new Random().nextInt(24));
        score=0;
    }
    //绘制面板
    public void paint(Graphics g){
        if(ui!=null){
            Graphics graphics=(g==null)?null:g.create();
            try{
                ui.update(graphics,this);
            }
            finally {
                graphics.dispose();
            }
        }
        //绘制静态面板
        this.setBackground(Color.WHITE);
        Data.header.paintIcon(this,g,25,11);//头部
        g.fillRect(25,75,850,600);

        //画积分
        g.setColor(Color.WHITE);
        g.setFont(new Font("微软雅黑",Font.BOLD,20));
        g.drawString("长度"+length,750,30);
        g.drawString("分数"+score,750,50);
        //画食物
        Data.food.paintIcon(this,g,foodx,foody);

        //把小蛇画上去
        if(direction.equals("R"))
        Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);
        else if(direction.equals("L"))
            Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);
        else  if(direction.equals("U"))
            Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);
        else  if(direction.equals("D"))
            Data.down.paintIcon(this,g,snakeX[0],snakeY[0]);

        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("按下空格开始游戏",300,300);
        }
        if(isFail==true){
            g.setColor(Color.RED);
            //设置字体
            g.setFont(new Font("微软雅黑",Font.BOLD,40));
            g.drawString("游戏失败",300,300);
        }
    }


    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        int keyCode = e.getKeyCode();
        //获取空格
        if(keyCode==KeyEvent.VK_SPACE){
            if(isFail){
                isFail=false;
                init();
            }
            isStart=!isStart;
            repaint();
        }
        if(keyCode==KeyEvent.VK_UP){
            direction="U";
        }else if(keyCode==KeyEvent.VK_DOWN){
            direction="D";
        }else if(keyCode==KeyEvent.VK_RIGHT){
            direction="R";
        }else if(keyCode==KeyEvent.VK_LEFT){
            direction="L";
        }

    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
    //事件监听-----通过
    @Override
    public void actionPerformed(ActionEvent e) {
        if(isStart&&isFail==false){ //如果游戏是开始状态
            //吃食物
            if(snakeX[0]==foodx&&snakeY[0]==foody){
                length++;//长度+1
                score+=10;//分数+10
                foodx=25+25*(new Random().nextInt(34));
                foody=75+25*(new Random().nextInt(24));
            }

            //移动
            for(int i=length-1;i>0;i--){// 后一节移到前一节的位置
                snakeX[i]=snakeX[i-1];
                snakeY[i]=snakeY[i-1];
            }
            //走向
            if(direction.equals("R")){ //右
                snakeX[0]+=25;
                if(snakeX[0]>850)  snakeX[0]=25;
            }else if(direction.equals("L")){    //左
                snakeX[0]-=25;
                if(snakeX[0]<25)  snakeX[0]=850;
            }
            else if(direction.equals("U")){     //上
                snakeY[0]-=25;
                if(snakeY[0]<75)  snakeY[0]=650;
            }
            else if(direction.equals("D")){     //下
                snakeY[0]+=25;
                if(snakeY[0]>650)  snakeY[0]=75;
            }

            //失败判定
            for(int i=1;i<length;i++){
                if(snakeY[0]==snakeY[i]&&snakeX[0]==snakeX[i])
                    isFail=true;
            }
            repaint();
        }
        timer.start();//定时器开启
    }
}

//键盘监听器

数据

package snake;

import javax.swing.*;
import java.net.URL;


public class Data {
    public static URL headerURL=Data.class.getResource("header.png");
    public static ImageIcon header=new ImageIcon(headerURL);
    //头部:上下左右
    public static URL upURL=Data.class.getResource("up.png");
    public static ImageIcon up=new ImageIcon(upURL);
    public static URL downURL=Data.class.getResource("down.png");
    public static ImageIcon down=new ImageIcon(downURL);
    public static URL leftURL=Data.class.getResource("left.png");
    public static ImageIcon left=new ImageIcon(leftURL);
    public static URL rightURL=Data.class.getResource("right.png");
    public static ImageIcon right=new ImageIcon(rightURL);

    //身体
    public static URL bodyURL=Data.class.getResource("body.png");
    public static ImageIcon body=new ImageIcon(bodyURL);
    //食物
    public static URL foodURL=Data.class.getResource("food.png");
    public static ImageIcon food=new ImageIcon(foodURL);

}

posted @ 2024-01-07 22:58  wnbzw  阅读(17)  评论(0)    收藏  举报