GUI SWING从入门到精通

****************************************************************************************************************************************************************************

1、百闻不如一经历
package com.day;
import com.day.pojo.SonFrame;

// 主函数入口
public class DayApplication {

    public static void main(String[] args) {
        new SonFrame();
    }
}
*******************************************************************
package com.day.pojo;

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

public class SonPanel1 extends JPanel {
    JButton click;

    public SonPanel1() {
        click = new JButton("点击");
        SonFrame.addClickListener(click);
        this.add(click);
        this.setLocation(500, 0);
        this.setPreferredSize(new Dimension(600, 300));
        this.setBackground(Color.red);
        this.setVisible(true);
    }
}
*******************************************************************
package com.day.pojo;

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

public class SonPanel2 extends JPanel {
    JButton touch;

    public SonPanel2() {
        touch = new JButton("触摸");
        SonFrame.addClickListener(touch);
        this.add(touch);
        this.setLocation(500, 250);
        this.setPreferredSize(new Dimension(600, 300));
        this.setBackground(Color.black);
        this.setVisible(true);
    }
}
*******************************************************************
package com.day.pojo;

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

public class SonFrame extends JFrame {
    static SonPanel1 sonPanel1 = new SonPanel1();
    static SonPanel2 sonPanel2 = new SonPanel2();

    public SonFrame() {
        // 流式布局
        this.setLayout(new FlowLayout());
        this.add(sonPanel1);
        this.add(sonPanel2);
        this.setLocation(500, 250);
        this.setSize(600, 600);
        this.setTitle("主体视图");
        this.setVisible(true);
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }

    public static void addClickListener(JButton jButton) {
        jButton.addActionListener(e -> { // lambda表达式
            String buttonInfo = e.getActionCommand();
            SonFrame temp = (SonFrame) jButton.getParent().getParent().getParent().getParent().getParent();
            switch (buttonInfo) {
                case "点击":
                    sonPanel1.setVisible(false);
                    sonPanel2.setVisible(true);
                    temp.setTitle("展示的是面板2");
                    break;
                case "触摸":
                    sonPanel1.setVisible(true);
                    sonPanel2.setVisible(false);
                    temp.setTitle("展示的是面板1");
                    break;
            }
        });
    }
}
************************************************
JOptionPane.showMessageDialog
        (this, "恭喜您全部答对!", "提示", JOptionPane.WARNING_MESSAGE);
************************************************
TextField比JTextField好用,JTextField会导致无法输入,程序卡不动。

****************************************************************************************************************************************************************************

1、GUI编程概述
【1】组件:窗口。弹窗。面板。文本框。列表框。按钮。图片。监听事件。鼠标事件。键盘事件。外挂。IDEA破解工具。
【2】SWING、AWT核心开发技术。因为界面丑所以不太广泛应用。主要是可以写小工具。重点了解监听。

****************************************************************************************************************************************************************************

2、AWT
【1】万物皆对象。包含了很多类与接口。GUI:图形用户界面编程。
【2】元素:窗口。按钮。文本框
【3】核心类:组件Component(按钮、文本、标签...)。Container容器(Windows Frame、Dialog、面板Panel Applet)

****************************************************************************************************************************************************************************

3、Frame操作
  Frame frame = new Frame("第一个图形窗口");
            frame.setSize(600, 600);
            frame.setVisible(true);
            frame.setBackground(Color.pink);
            frame.setLocation(20, 20);
            // 设置大小固定
            frame.setResizable(false);

****************************************************************************************************************************************************************************

4、面板Panel
 Frame frame = new Frame();
        Panel panel = new Panel();
        // 设置布局
        frame.setLayout(null);
        frame.setBounds(300, 300, 500, 500);
        frame.setBackground(Color.PINK);
        // panel设置
        panel.setBounds(50, 50, 400, 400);
        panel.setBackground(Color.CYAN);

        frame.add(panel);
        frame.setVisible(true);

        // 监听窗口关闭
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

****************************************************************************************************************************************************************************

5、布局管理
【1】流式布局 FlowLayout。BorderLayout 东西南北中布局。表格布局GridLayout。
【2】先思考80%。代码20%。不要上来就写代码。

****************************************************************************************************************************************************************************

6、事件监听
【1】当某个事情发的时候,需要干什么。
  Frame frame = new Frame();
        Button button_1 = new Button();
        frame.add(button_1);
        frame.setSize(600, 600);
        frame.setVisible(true);
        // 按钮监听
        button_1.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                button_1.setLabel("add label");
            }
        });
        // 关闭监听
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

****************************************************************************************************************************************************************************

8、计算器
【1】组合(一个类在另一个类作为成员变量使用)大于继承
【2】内部类最大的好处,就是可以畅通无阻的访问外部类
package com.day.pojo;
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 Update {
    TextField textField_1, textField_2, textField_3;

    public void loadFrame() {
        // 窗体
        Frame frame = new Frame();
        frame.setLayout(new FlowLayout());

        // 3个文本框
        textField_1 = new TextField(10); // 字符数指定
        textField_2 = new TextField(10);
        textField_3 = new TextField(20);

        // 1个按钮
        Button button = new Button("=");
        button.addActionListener(new MyActionListener());

        // 1个标签
        Label label = new Label("+");

        // 布局
        frame.add(textField_1);
        frame.add(label);
        frame.add(textField_2);
        frame.add(button);
        frame.add(textField_3);

        // 设置可见
        frame.setSize(600, 600);
        frame.setVisible(true);
        // 设置点击可关闭
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }

    private class MyActionListener implements ActionListener {
        @Override
        public void actionPerformed(ActionEvent e) {
            // 1. 获得操作的数 2.将值加法运算 3.放到3个框,清空12框
            int num_1 = Integer.parseInt(textField_1.getText());
            int num_2 = Integer.parseInt(textField_2.getText());
            int num_3 = num_1 + num_2;
            textField_1.setText("");
            textField_2.setText("");
            textField_3.setText(num_3 + "");
        }
    }
}
【3】我的思路
package com.day.pojo;

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 Calculator {
    public Calculator() {
        // 窗体
        Frame frame = new Frame();
        frame.setLayout(new FlowLayout());

        // 3个文本框
        TextField textField_1 = new TextField(10); // 字符数指定
        TextField textField_2 = new TextField(10);
        TextField textField_3 = new TextField(20);

        // 1个按钮
        Button button = new Button("=");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // 1. 获得操作的数 2.将值加法运算 3.放到3个框,清空12框
                int num_1 = Integer.parseInt(textField_1.getText());
                int num_2 = Integer.parseInt(textField_2.getText());
                int num_3 = num_1 + num_2;
                textField_1.setText("");
                textField_2.setText("");
                textField_3.setText(num_3 + "");
            }
        });

        // 1个标签
        Label label = new Label("+");

        // 布局
        frame.add(textField_1);
        frame.add(label);
        frame.add(textField_2);
        frame.add(button);
        frame.add(textField_3);

        // 设置可见
        frame.setSize(600, 600);
        frame.setVisible(true);
        // 设置点击可关闭
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

****************************************************************************************************************************************************************************

9、画笔
【1】实际代码
package com.day.pojo;

import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class MyPaint {

    public void doWork() {
        Frame frame = new Frame() {
            @Override
            public void paint(Graphics g) {
                // super.paint(graphics);
                g.setColor(Color.red);
                g.drawOval(100, 100, 100, 100);
                g.fill3DRect(200, 200, 100, 100, false);
                // 养成习惯,画笔用完,把他还原成最初的颜色
            }
        };
        frame.setSize(600, 600);

        frame.setVisible(true);
        frame.addWindowListener(new WindowAdapter() {
            @Override
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });
    }
}

****************************************************************************************************************************************************************************

10、鼠标监听事件
【1】另一种思路
package com.day.pojo;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;

public class MyFrame {
    private ArrayList myPointList = new ArrayList<MyPoint>();

    public void doWork() {
        Frame frame = new Frame() {
            @Override
            public void paint(Graphics g) {
                Iterator iterator = myPointList.iterator();
                while (iterator.hasNext()) {
                    MyPoint myPoint = (MyPoint) iterator.next();
                    g.setColor(Color.BLACK);
                    g.fillOval(myPoint.getX(), myPoint.getY(), 10, 10);
                }
                this.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
            }
        };
        // 因为frame为空无法repaint,所以要单独再添加
        frame.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                System.out.println(e.getX());
                myPointList.add(new MyPoint(e.getX(), e.getY()));
                frame.repaint();
            }
        });

        frame.setSize(600, 600);
        frame.setTitle("画图");
        frame.setVisible(true);
    }
}

****************************************************************************************************************************************************************************

11、窗口监听事件
【1】我已经无师自通,使用了匿名内部类
【2】主要也是关闭事件,别的用的很少
 Frame frame = new Frame() {
            @Override
            public void paint(Graphics g) {
                Iterator iterator = myPointList.iterator();
                while (iterator.hasNext()) {
                    MyPoint myPoint = (MyPoint) iterator.next();
                    g.setColor(Color.BLACK);
                    g.fillOval(myPoint.getX(), myPoint.getY(), 10, 10);
                }
                this.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
            }
        };

****************************************************************************************************************************************************************************

13、键盘监听事件
【1】开发游戏会用到,和键盘窗口差不多
package com.day.pojo;

import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.Iterator;

public class MyFrame {
    private ArrayList myPointList = new ArrayList<MyPoint>();

    public void doWork() {
        Frame frame = new Frame() {
            @Override
            public void paint(Graphics g) {
                this.addWindowListener(new WindowAdapter() {
                    @Override
                    public void windowClosing(WindowEvent e) {
                        System.exit(0);
                    }
                });
            }
        };
        // 因为frame为空无法repaint,所以要单独再添加
        frame.addKeyListener(new KeyAdapter() {
            @Override
            public void keyPressed(KeyEvent e) {
                //System.out.println(e.getKeyCode()); // 不用记录数组,用KeyEvent.XXX即可
                if (e.getKeyCode() == KeyEvent.VK_ENTER) {
                    System.out.println("按下了Enter键盘");
                }
            }
        });

        frame.setSize(600, 600);
        frame.setTitle("画图");
        frame.setVisible(true);
    }
}

****************************************************************************************************************************************************************************

14、Swing之JFrame窗体
【1】对我来说太简单了
package com.day.pojo;

import javax.swing.*;

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");

        JLabel jLabel = new JLabel("HIT GUI开发");
        jLabel.setHorizontalAlignment(SwingConstants.CENTER);

        jFrame.add(jLabel);

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

****************************************************************************************************************************************************************************

15、JDialog弹窗
【1】看实现代码
package com.day.pojo;

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 按钮
        JButton jButton = new JButton("点击弹出一个对话框");
        jButton.setBounds(30, 30, 200, 50);
        // 监听事件
        jButton.addMouseListener(new MouseAdapter() {
            @Override
            public void mouseClicked(MouseEvent e) {
                // 弹窗
                MyDialog myDialog = new MyDialog();
            }
        });

        container.add(jButton);

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

class MyDialog {
    public MyDialog() {
        // 弹窗
        JDialog jDialog = new JDialog();
        jDialog.setVisible(true);
        jDialog.setBounds(100, 100, 500, 500);
        Container container = jDialog.getContentPane();
        container.add(new Label("HIT Window"));
    }
}

****************************************************************************************************************************************************************************

16、Icon、ImageIcon标签
【1】标签:Label。
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        Icon icon = new Icon() {
            @Override
            public void paintIcon(Component c, Graphics g, int x, int y) {
                g.fillOval(x, 23, 15, 15);
            }

            @Override
            public int getIconWidth() {
                return 0;
            }

            @Override
            public int getIconHeight() {
                return 0;
            }
        };

        JLabel jLabel = new JLabel("     标签", icon, SwingConstants.CENTER);
        jLabel.setBounds(0, 0, 60, 60);
        jLabel.setBackground(Color.RED);

        container.add(jLabel);

        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【2】图片
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        ImageIcon imageIcon = new ImageIcon("src/main/resources/1.jpg");

        JLabel jLabel = new JLabel("     标签", imageIcon, SwingConstants.CENTER);
        jLabel.setBounds(100, 100, 300, 300);
        container.add(jLabel);

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

****************************************************************************************************************************************************************************

17、文本域JScroll面板
【1】JPanel
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 面板
        JPanel jPanel = new JPanel();
        jPanel.setBounds(0, 0, 100, 100);
        jPanel.add(new JButton("HIT按钮_1"));

        container.add(jPanel);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【2】动态面板
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 文本域
        JTextArea jTextArea = new JTextArea(50, 50);
        jTextArea.setText("欢迎学习JAVA GUI");

        // Scroll面板
        JScrollPane jScrollPane = new JScrollPane(jTextArea);
        jScrollPane.setBounds(200, 200, 200, 200);


        container.add(jScrollPane);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

****************************************************************************************************************************************************************************

18、图片按钮、单选框、多选框
【1】图片按钮
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 图片按钮
        ImageIcon imageIcon = new ImageIcon("src/main/resources/1.jpg");
        JButton jButton = new JButton(imageIcon);
        jButton.setBounds(0, 0, 300, 300);

        container.add(jButton);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【2】单选框
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 选框
        JRadioButton jRadioButton_1 = new JRadioButton("单选按钮_1");
        jRadioButton_1.setBounds(0, 0, 100, 50);
        JRadioButton jRadioButton_2 = new JRadioButton("单选按钮_2");
        jRadioButton_2.setBounds(150, 0, 100, 50);
        JRadioButton jRadioButton_3 = new JRadioButton("单选按钮_3");
        jRadioButton_3.setBounds(300, 0, 100, 50);
        ButtonGroup buttonGroup = new ButtonGroup();
        // 一个组智能选择一个
        buttonGroup.add(jRadioButton_1);
        buttonGroup.add(jRadioButton_2);
        buttonGroup.add(jRadioButton_3);

        container.add(jRadioButton_1);
        container.add(jRadioButton_2);
        container.add(jRadioButton_3);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【3】多选框
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 选框
        JCheckBox jCheckBox_1 = new JCheckBox("多选_1");
        jCheckBox_1.setBounds(0, 0, 100, 50);
        JCheckBox jCheckBox_2 = new JCheckBox("多选_2");
        jCheckBox_2.setBounds(100, 0, 100, 50);

        container.add(jCheckBox_1);
        container.add(jCheckBox_2);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

****************************************************************************************************************************************************************************

19、下拉框、列表框
【1】下拉框:选择一些单个选项
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 下拉框
        JComboBox jComboBox = new JComboBox();
        jComboBox.setBounds(100, 100, 200, 30);
        jComboBox.addItem(null);
        jComboBox.addItem("正在上映");
        jComboBox.addItem("即将上映");

        container.add(jComboBox);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【2】列表框:展示一些信息,动态扩容
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 下拉框
        String[] myArray = {"1", "2", "3"};
        JList jList = new JList(myArray);
        jList.setBounds(100, 100, 100, 100);


        container.add(jList);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

****************************************************************************************************************************************************************************

20、文本框、密码框、文本域
【1】文本框
package com.day.pojo;
import javax.swing.*;
import java.awt.*;
public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 文本框
        JTextField jTextField = new JTextField("Hello");
        jTextField.setBounds(100, 100, 100, 30);

        container.add(jTextField);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【2】密码框
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 文本框
        JPasswordField jPasswordField = new JPasswordField();
        jPasswordField.setBounds(100, 100, 100, 30);
        jPasswordField.setEchoChar('*');

        container.add(jPasswordField);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
【3】文本域
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 获取当前容器,放内容
        Container container = jFrame.getContentPane();
        // 绝对布局
        container.setLayout(null);

        // 文本框
        JTextArea jTextArea = new JTextArea("文本区域");
        jTextArea.setBounds(100, 100, 100, 30);
        // 面板
        JScrollPane jScrollPane = new JScrollPane(jTextArea);
        jScrollPane.setBounds(100, 100, 100, 30);

        container.add(jScrollPane);
        jFrame.setSize(600, 600);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

****************************************************************************************************************************************************************************

21、贪吃蛇界面绘制
【1】帧:如果时间足够小,就是动画,一秒30帧 60帧。连起来是动画,拆开就是静态的图片。
package com.day.pojo;

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

public class MyFrame {
    public void doWork() {
        JFrame jFrame = new JFrame("这是JFrame窗口");

        // 游戏面板
        JPanel jPanel = new JPanel() {
            // 游戏里的所有东西都使用这个画笔
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g); // 清屏用的
                this.setBackground(Color.WHITE);
                //Data.headImageIcon.paintIcon(this, g, 25, 11); // 广告的位置
                g.fillRect(25, 75, 850, 600); // 默认游戏界面
            }
        };
        JLabel jLabel = new JLabel("", Data.headImageIcon, SwingConstants.CENTER); // 这么用很快
        jPanel.add(jLabel);

        jFrame.add(jPanel);
        jFrame.setSize(900, 720);
        jFrame.setResizable(false);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}
----------------------------------
package com.day.pojo;

import javax.swing.*;

public class Data {
    public static ImageIcon headImageIcon = new ImageIcon("src/main/resources/res/head.jpg");

    public static ImageIcon upImageIcon = new ImageIcon("src/main/resources/res/up.png");
    public static ImageIcon downImageIcon = new ImageIcon("src/main/resources/res/down.png");
    public static ImageIcon leftImageIcon = new ImageIcon("src/main/resources/res/left.png");
    public static ImageIcon rightImageIcon = new ImageIcon("src/main/resources/res/right.png");

    public static ImageIcon bodyImageIcon = new ImageIcon("src/main/resources/res/body.png");
    public static ImageIcon foodImageIcon = new ImageIcon("src/main/resources/res/food.png");
}

****************************************************************************************************************************************************************************

22-26、贪吃蛇实战(自己解决了一个BUG)
package com.day.pojo;

import javax.swing.*;

public class Data {
    public static ImageIcon headImageIcon = new ImageIcon("src/main/resources/image/head.jpg");

    public static ImageIcon upImageIcon = new ImageIcon("src/main/resources/image/up.png");
    public static ImageIcon downImageIcon = new ImageIcon("src/main/resources/image/down.png");
    public static ImageIcon leftImageIcon = new ImageIcon("src/main/resources/image/left.png");
    public static ImageIcon rightImageIcon = new ImageIcon("src/main/resources/image/right.png");

    public static ImageIcon bodyImageIcon = new ImageIcon("src/main/resources/image/body.png");
    public static ImageIcon foodImageIcon = new ImageIcon("src/main/resources/image/food.png");
}
*********************************
package com.day.pojo;

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 {
    // 构造函数的使用
    public GamePanel() {
        // new对象时就执行
        JLabel jLabel = new JLabel(new ImageIcon("src/main/resources/image/head.jpg"));
        this.add(jLabel);
        init();
        this.setFocusable(true); //获取焦点
        this.addKeyListener(this);
        timer.start(); // 开启定时器
    }

    // 定义蛇的数据结构
    int length; // 小蛇的长度
    int[] snakeX = new int[600]; // 小蛇的X坐标
    int[] snakeY = new int[500]; // 小蛇的Y坐标
    String direct;// 方向
    boolean startFlag = false;

    //食物的出现
    int foodX;
    int foodY;
    Random random = new Random();

    // 是否失败
    boolean failFlag = false;
    Integer score;
    String beforePress;

    // 初始化小蛇
    public void init() {
        length = 3;
        direct = "R";
        // 头
        snakeX[0] = 160;
        snakeY[0] = 80;
        // 身体1
        snakeX[1] = 80;
        snakeY[1] = 80;
        //身体2
        snakeX[2] = 0;
        snakeY[2] = 80;
        // 食物随机分布
        foodX = 80 + 80 * random.nextInt(9);
        foodY = 80 + 80 * random.nextInt(9);
        score = 0;
    }

    // 定时刷新
    Timer timer = new Timer(150, this);

    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g); // 清屏用的
        this.setBackground(Color.WHITE);
        //Data.headImageIcon.paintIcon(this, g, 25, 11); // 广告的位置
        g.fillRect(25, 75, 880, 880); // 默认游戏界面
        // 画积分
        g.setColor(Color.white);
        g.setFont(new Font("微软雅黑", Font.BOLD, 40));
        g.drawString("长度 " + length, 750, 120);
        g.drawString("分数 " + score, 750, 180);

        // 画食物
        Data.foodImageIcon.paintIcon(this, g, foodX, foodY);
        // 画小蛇
        System.out.println(beforePress);
        switch (direct) {
            case "R":
                if (beforePress != null && !beforePress.equals("L")) {
                    Data.rightImageIcon.paintIcon(this, g, snakeX[0], snakeY[0]);
                    break;
                }
            case "L":
                if (beforePress != null && !beforePress.equals("R")) {
                    Data.leftImageIcon.paintIcon(this, g, snakeX[0], snakeY[0]);
                    break;
                }
            case "U":
                if (beforePress != null && !beforePress.equals("D")) {
                    Data.upImageIcon.paintIcon(this, g, snakeX[0], snakeY[0]);
                    break;
                }
            case "D":
                if (beforePress != null && !beforePress.equals("U")) {
                    Data.downImageIcon.paintIcon(this, g, snakeX[0], snakeY[0]);
                    break;
                }
        }
        beforePress = direct;
        for (int i = 1; i < length; i++) {
            Data.bodyImageIcon.paintIcon(this, g, snakeX[i], snakeY[i]);
        }
        // 游戏状态
        if (!startFlag) {
            g.setColor(Color.white);
            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            g.drawString("按下空格开始游戏", 300, 300);
        }
        // 判断是否失败
        if (failFlag) {
            g.setColor(Color.red);
            g.setFont(new Font("微软雅黑", Font.BOLD, 40));
            g.drawString("游戏失败,按下空格重新开始!!!", 300, 300);
        }
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        if (startFlag && !failFlag) {
            // System.out.println(snakeX[0] + "VS" + foodX);
            //System.out.println(snakeY[0] + "VS" + foodY);
            if (foodX == snakeX[0] && foodY == snakeY[0]) {
                length++;// 长度+1
                score = score + 10;
                // 重新生成食物
                foodX = 80 + 80 * random.nextInt(9);
                foodY = 80 + 80 * random.nextInt(9);
            }
            // 右移动
            for (int i = length; i > 0; i--) {
                snakeX[i] = snakeX[i - 1];
                snakeY[i] = snakeY[i - 1];
            }
            switch (direct) {
                case "R":
                    snakeX[0] = snakeX[0] + 80;
                    if (snakeX[0] > 880) {
                        snakeX[0] = 30;
                    }
                    break;
                case "L":
                    snakeX[0] = snakeX[0] - 80;
                    if (snakeX[0] < 0) {
                        snakeX[0] = 880;
                    }
                    break;
                case "U":
                    snakeY[0] = snakeY[0] - 80;
                    if (snakeY[0] < 0) {
                        snakeY[0] = 880;
                    }
                    break;
                case "D":
                    snakeY[0] = snakeY[0] + 80;
                    if (snakeY[0] > 880) {
                        snakeY[0] = 0;
                    }
                    break;
            }
            // 判断失败
            for (int i = 1; i < length; i++) {
                if (snakeX[0] == snakeX[i] && snakeY[0] == snakeY[i]) {
                    failFlag = true;
                }
            }
            this.repaint(); //重画页面
        }
    }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    public void keyPressed(KeyEvent e) {
        //System.out.println(e.getKeyCode());
        int keyCode = e.getKeyCode();
        if (keyCode == KeyEvent.VK_SPACE) { // 如果按下空格 就开始动
            if (failFlag) {
                // 重新开始
                failFlag = false;
                init();
            } else {
                startFlag = !startFlag; //取反
            }
            this.repaint();
        }
        // 小蛇移动
        switch (keyCode) {
            case KeyEvent.VK_UP:
                if (beforePress != null && !beforePress.equals("D")) {
                    direct = "U";
                    break;
                }
            case KeyEvent.VK_DOWN:
                if (beforePress != null && !beforePress.equals("U")) {
                    direct = "D";
                    break;
                }
            case KeyEvent.VK_LEFT:
                if (beforePress != null && !beforePress.equals("R")) {
                    direct = "L";
                    break;
                }
            case KeyEvent.VK_RIGHT:
                if (beforePress != null && !beforePress.equals("L")) {
                    direct = "R";
                    break;
                }
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {

    }
}
*************************
package com.day;


import com.day.pojo.GamePanel;

import javax.swing.*;

/**
 * main function
 */
public class DayApplication {
    public static void main(String[] args) {
        JFrame jFrame = new JFrame("这是JFrame窗口");
        // 游戏面板
        GamePanel gamePanel = new GamePanel();

        jFrame.add(gamePanel);
        jFrame.setSize(1000, 1000);
        jFrame.setResizable(false);
        jFrame.setVisible(true);
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/590653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构与算法-单向环形链表与约瑟夫问题

1.简介 单向环形链表&#xff0c;闭合的形成一个环。 单向环形链表的一个应用场景是约瑟夫问题。 约瑟夫问题为&#xff1a;设编号为1&#xff0c;2&#xff0c;…&#xff0c;n的n个人围坐一圈&#xff0c;约定编号为k(1<k<n)的人从1开始报数&#xff0c;数到m的那个人…

C语言-------实现贪吃蛇小游戏

目录 一、预备知识 1.1 Win32 API介绍 Windows 这个多作业系统除了协调应用程序的执行、分配内存、管理资源之外&#xff0c; 它同时也是一个很大的服务中心&#xff0c;调用这个服务中心的各种服务&#xff08;每一种服务就是一个函数&#xff09;&#xff0c;可以帮应用程…

如何在latex中使用第三方字体

最近想到一个问题&#xff1a;如何在 LaTeX \LaTeX LATE​X中使用第三方字体。 这个问题其实挺基础的&#xff0c;但是因为小白的 LaTeX \LaTeX LATE​X水平&#xff0c;应该说五六年了&#xff0c;毫无进步。 所以确实还是需要解决一下这个基础的问题。 小白最近使用的是TeXs…

Python | Leetcode Python题解之第65题有效数字

题目&#xff1a; 题解&#xff1a; from enum import Enumclass Solution:def isNumber(self, s: str) -> bool:State Enum("State", ["STATE_INITIAL","STATE_INT_SIGN","STATE_INTEGER","STATE_POINT","STATE_…

基于 Spring Boot 博客系统开发(五)

基于 Spring Boot 博客系统开发&#xff08;五&#xff09; 本系统是简易的个人博客系统开发&#xff0c;为了更加熟练地掌握 SprIng Boot 框架及相关技术的使用。&#x1f33f;&#x1f33f;&#x1f33f; 基于 Spring Boot 博客系统开发&#xff08;四&#xff09;&#x1f…

408数据结构-二叉树的概念、性质与存储结构 自学知识点整理

前置知识&#xff1a;树的基本概念与性质 二叉树的定义 二叉树是一种特殊的树形结构&#xff0c;其特点是每个结点至多只有两棵子树&#xff08;即二叉树中不存在度大于 2 2 2的结点&#xff09;&#xff0c;并且二叉树是有序树&#xff0c;左右子树不能互换。 与树类似&#…

fastdfs安装

fastdfs安装步骤 一 、原理 FastDFS是一个开源的轻量级分布式文件系统&#xff0c;由跟踪服务器&#xff08;tracker server&#xff09;、存储服务器&#xff08;storage server&#xff09;和客户端&#xff08;client&#xff09;三个部分组成&#xff0c;主要解决了海量数…

Flutter笔记:Widgets Easier组件库(10)快速处理承若型对话

Flutter笔记 使用Widgets Easier组件库快速处理承若型对话 - 文章信息 - Author: 李俊才 (jcLee95) Visit me at CSDN: https://jclee95.blog.csdn.netMy WebSite&#xff1a;http://thispage.tech/Email: 291148484163.com. Shenzhen ChinaAddress of this article:https://…

光固化打印--问题记录

平面翘起 原因&#xff1a;角度平&#xff0c;缺支持 解决&#xff1a; 45度角度摆放底部平面起皮 原因&#xff1a;缺少支撑&#xff0c;原始结构支持无法支撑平面。 解决&#xff1a;增加支撑

【数学 排列组合】1643. 第 K 条最小指令

本文涉及知识点 数学 排列组合 LeetCode1643. 第 K 条最小指令 Bob 站在单元格 (0, 0) &#xff0c;想要前往目的地 destination &#xff1a;(row, column) 。他只能向 右 或向 下 走。你可以为 Bob 提供导航 指令 来帮助他到达目的地 destination 。 指令 用字符串表示&am…

Mybatis之Sqlsession、Connection和Transaction三者间的关系

前言 最近在看Mybatis的源码&#xff0c;搜到这篇文章Sqlsession、Connection和Transaction原理与三者间的关系&#xff0c;debug之后发现有不少疑惑&#xff0c;于是按照原文整理了一下&#xff0c;记录下debug中的一些困惑点。 对于我们开发来讲&#xff0c;不管跟任何关系…

2024五一数学建模C题完整论文讲解(含完整python代码及几十个特征表、处理表、结果表)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2024五一数学建模C题煤矿深部开采冲击地压危险预测完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 C题论文…

【Docker学习】docker version查看版本信息

就像很多应用一样&#xff0c;docker也使用version来查看版本信息。但因为docker包含有不少独立组件&#xff0c;version的作用范围会更广一些。 用法1&#xff1a; docker --version 描述&#xff1a; 输出安装的Docker CLI 的版本号。关于Docker CLI&#xff0c;请访问。 实操…

数字电路-5路呼叫显示电路和8路抢答器电路

本内容涉及两个电路&#xff0c;分别为5路呼叫显示电路和8路抢答器电路&#xff0c;包含Multisim仿真原文件&#xff0c;为掌握FPGA做个铺垫。紫色文字是超链接&#xff0c;点击自动跳转至相关博文。持续更新&#xff0c;原创不易&#xff01; 目录&#xff1a; 一、5路呼叫显…

如何免费体验 gpt2-chatbot

如何免费体验 gpt2-chatbot 就在五一假期期间&#xff0c;一个神秘模型在没有任何官方文件的情况下突然发布。发布后不到 12 小时就立即引起人工智能爱好者和专家们的关注。这个名为“gpt2-chatbot”的神秘新模型凭借其令人印象深刻的能力轰动全球。有人猜测它可能是 OpenAI 的…

Python爬取豆瓣电影Top250数据

任务 爬取豆瓣电影top250中的影片名称、影片海报、年份、地区、类型、评分、评价人数、总体评价&#xff0c;并输出到douban_top250.xlsx文件中 环境 Python 3.8 requests bs4 openpyxl 源码 # 创建一个新的Excel工作簿 workbook openpyxl.Workbook() # 获取默认的工作表…

新版security demo(二)前端

写这篇博客&#xff0c;刚好换了台电脑&#xff0c;那就借着这个demo复习下VUE环境的搭建。 一、前端项目搭建 1、安装node 官网下载安装即可。 2、安装脚手架 npm install -g vue-cli 使用脚手架搭建一个demo前端项目 vue init webpack 项目名称 3、安装依赖 这里安装…

OpenCV(三)—— 车牌筛选

本篇文章要介绍如何对从候选车牌中选出最终进行字符识别的车牌。 无论是通过 Sobel 还是 HSV 计算出的候选车牌都可能不止一个&#xff0c;需要对它们进行评分&#xff0c;选出最终要进行识别的车牌。这个过程中会用到两个理论知识&#xff1a;支持向量机和 HOG 特征。 1、支…

vivado Aurora 8B/10B IP核(9)- CRC、 Aurora 8B/10B内核的时钟接口端口

CRC 模块提供 16 位或 32 位 CRC&#xff0c;用于用户数据。 Aurora 8B/10B 内核的时钟接口端口 从相邻收发器四边形的时钟Xilinx 实现工具可以根据需要对南北路由和引脚交换到收发器时钟输入进行必要的调整&#xff0c;以将时钟从一个四线到另一个。 重要信息&#xff1a;共…

25计算机考研院校数据分析 | 哈尔滨工业大学

哈尔滨工业大学&#xff08;Harbin Institute of Technology&#xff09;&#xff0c;简称哈工大&#xff0c; 校本部位于黑龙江省哈尔滨市&#xff0c;是由工业和信息化部直属的全国重点大学&#xff0c;位列国家“双一流”、“985工程”、“211工程”&#xff0c;九校联盟 、…
最新文章