GUI编程

GUI编程


告诉大家该怎么学?

  • 这是什么?

  • 它怎么玩?

  • 该如何去我们平时运用?

组件

  • 弹窗

  • 窗口

  • 面板

  • 文本框

  • 列表框

  • 按钮

  • 图片

  • 监听事件

  • 鼠标

  • 键盘事件

  • 破解工具

 

1、简介

GUI的核心技术:Swing AWT

  1. 因为页面不美观。

  2. 需要 jre 环境!

为什么我们要学习?

  1. 可以写出自己心中想要的一些小工具

  2. 工作的时候,也可能需要维护到swing界面,概率极小!

  3. 了解MVC架构,了解监听!

2、AWT

2.1、Awt介绍

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

  2. 元素:窗口,按钮,文本框

  3. java.awt

2.2、组件和容器

1、Frame

 //GUI的第一个界面
 public class TestFrame {
     public static void main(String[] args) {
 ​
         //Frame , JDK , 看源码!
         Frame frame = new Frame("我的第一个Java图形界面窗口");
 ​
         //需要设置可见性  w h
         frame.setVisible(true);
 ​
         //设置窗口大小
         frame.setSize(400,400);
 ​
         //设置背景颜色  Color
         frame.setBackground(new Color(33, 194, 108));
 ​
         //弹出的初始位置
         frame.setLocation(400,400);
 ​
         //设置大小固定
         frame.setResizable(false);
     }
 }

问题:发现窗口关闭不掉,停止Java程序!

尝试回顾封装:

 package com.kuang.lesson01;
 ​
 import java.awt.*;
 ​
 public class TestFrame2 {
     public static void main(String[] args) {
         //展示多个窗口 new
         MyFrame myFrame = new MyFrame(100, 100, 200, 200, Color.black);
         MyFrame myFrame1 = new MyFrame(300, 100, 200, 200, Color.red);
         MyFrame myFrame2 = new MyFrame(100, 300, 200, 200, Color.green);
         MyFrame myFrame3 = new MyFrame(300, 300, 200, 200, Color.MAGENTA);
 ​
     }
 ​
 }
 class MyFrame extends Frame {
     static int id = 0;//可能存在多个窗口,我们需要一个计数器
 ​
     public MyFrame(int x,int y,int w,int h,Color color){
         super("MyFrame+"+(++id));
         setBackground(color);
         setBounds(x,y,w,h);
         setVisible(true);
     }
 ​
 }

 

2、面板Panel

解决了关闭事件!

 package com.kuang.lesson01;
 ​
 import java.awt.*;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 ​
 //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(45, 215, 200));
 ​
         //panel 设置坐标,相对于frame
         panel.setBounds(50,50,400,400);
         panel.setBackground(new Color(0xEF0F0F));
 ​
         //frame.add(panel)
         frame.add(panel);
 ​
         frame.setVisible(true);
 ​
         //监听事件,监听窗口关闭事件 System.exit(0)
         //适配器模式:
         frame.addWindowListener(new WindowAdapter() {
             //窗口点击关闭事件
             @Override
             public void windowClosing(WindowEvent e) {
                 //结束程序
                 System.exit(0);
             }
         });
     }
 }
 ​

 

3、布局管理器

  • 流式布局

 package com.kuang.lesson01;
 ​
 import java.awt.*;
 ​
 public class TestFlowLayout {
     public static void main(String[] args) {
         Frame frame = new Frame();
 ​
         //组件~按钮
         Button button = new Button("button");
         Button button1 = new Button("button1");
         Button button2 = new Button("button2");
 ​
         //设置为流式布局
         //frame.setLayout(new FlowLayout());
         frame.setLayout(new FlowLayout(FlowLayout.LEFT));
 ​
         frame.setSize(200,200);
 ​
         //把按钮添加上去
         frame.add(button);
         frame.add(button1);
         frame.add(button2);
 ​
         frame.setVisible(true);
 ​
     }
 }
  • 东西南北中

 package com.kuang.lesson01;
 ​
 import java.awt.*;
 ​
 public class TestBorderLayout {
     public static void main(String[] args) {
         Frame frame = new Frame("TestBorderLayout");
 ​
         Button east = new Button("East");
         Button west = new Button("West");
         Button south = new Button("South");
         Button north = new Button("North");
         Button center = new Button("Center");
 ​
         frame.add(east,BorderLayout.EAST);
         frame.add(west,BorderLayout.WEST);
         frame.add(south,BorderLayout.SOUTH);
         frame.add(north,BorderLayout.NORTH);
         frame.add(center,BorderLayout.CENTER);
 ​
 ​
         frame.setSize(200,200);
         frame.setVisible(true);
     }
 }
  • 表格布局 Grid

 package com.kuang.lesson01;
 ​
 import java.awt.*;
 ​
 public class TestGridLayout {
     public static void main(String[] args) {
         Frame frame = new Frame("TestGridLayout");
 ​
         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();//Java函数!自动布局调优!
         frame.setVisible(true);
     }
 }

练习题:

分析过程:

代码实现:

 package com.kuang.lesson01;
 ​
 import java.awt.*;
 ​
 //练习题
 public class Test {
     public static void main(String[] args) {
         Frame frame = new Frame();
 ​
         frame.setSize(400,300);
         frame.setLocation(300,400);
         frame.setBackground(Color.BLACK);
         frame.setLayout(new GridLayout(2,1));
 ​
         //4个面板
         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));
 ​
         //上面OK
         p1.add(new Button("East_1"),BorderLayout.EAST);
         p1.add(new Button("West_1"),BorderLayout.WEST);
         p2.add(new Button("P2-btn-1"));
         p2.add(new Button("P2-btn-2"));
         p1.add(p2,BorderLayout.CENTER);
 ​
         //下面
         p3.add(new Button("East_2"),BorderLayout.EAST);
         p3.add(new Button("West_2"),BorderLayout.WEST);
 ​
         //中间4个
         for (int i = 0; i < 4; i++) {
             p4.add(new Button("for-"+i));
         }
         p3.add(p4,BorderLayout.CENTER);
 ​
         frame.add(p1);
         frame.add(p3);
     }
 }
         frame.addWindowListener(new WindowAdapter() {
             @Override
             public void windowClosing(WindowEvent e) {
                 System.exit(0);
             }
         });
         frame.setVisible(true);//有的时候放在前面没有办法显示所有可以把它放在最后面实现程序的可见性!

总结:

  1. Frame是一个顶级窗口

  2. Panel无法单独显示,必须添加到某个容器中。

  3. 布局管理器

    1. 流式

    2. 东西南北中

    3. 表格

  4. 大小,定位,背景颜色,可见性,监听

4、事件监听

事件监听:当某个事情发生的时候,干什么?

 package com.kuang.lesson02;
 ​
 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,所以我们创造一个ActionListener
         MyActionListenner myActionListenner = new MyActionListenner();
         button.addActionListener(myActionListenner);
         frame.pack();
         frame.add(button);
         windowClose(frame);//关闭窗口
         frame.setVisible(true);
     }
     //关闭窗口事件
     private static void windowClose(Frame frame){
         frame.addWindowListener(new WindowAdapter() {
             @Override
             public void windowClosing(WindowEvent e) {
                 System.exit(0);
             }
         });
     }
 }
 ​
 class MyActionListenner implements ActionListener{
 ​
     @Override
     public void actionPerformed(ActionEvent e) {
         System.out.println("aaa");
     }
 }

多个按钮,共享一个事件

 package com.kuang.lesson02;
 ​
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 ​
 public class TestActionTwo {
     public static void main(String[] args) {
         //两个按钮  实现同一个监听
         //开始   停止
         Frame frame = new Frame("开始-停止");
         Button button1 = new Button("start");
         Button button2 = new Button("stop");
 ​
         //可以显示的定义触发会返回的命令,如果不显示定义,则会走默认的值!
         //可以多个按钮只写一个监听类
         button2.setActionCommand("button2-stop");
 ​
         MyMonitor myMonitor = new MyMonitor();
 ​
         button1.addActionListener(myMonitor);
         button2.addActionListener(myMonitor);
 ​
         frame.add(button1,BorderLayout.NORTH);
         frame.add(button2,BorderLayout.SOUTH);
 ​
         frame.pack();
         frame.setVisible(true);
 ​
     }
 }
 class MyMonitor implements ActionListener{
     @Override
     public void actionPerformed(ActionEvent e) {
         System.out.println("按钮被点击了:msg=>"+e.getActionCommand());
         //下面的这个如果以后需要一个按钮同时监听多个时间不需要写创建那么多只需要循环进行判断即可!
         if (e.getActionCommand().equals("start")){
 ​
         }
     }
 }

2.5、输入框 TextField 监听

 package com.kuang.lesson02;
 ​
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 ​
 public class TestText01 {
     public static void main(String[] args) {
         //启动!
         new MyFrame();
     }
 }
 class MyFrame extends Frame{
     public MyFrame(){
         TextField textField = new TextField();
         add(textField);
 ​
         //监听这个文本框输入的文字
         MyActionListener2 myActionListener2 = new MyActionListener2();
         //按下enter 就会触发这个输入框的事件
         textField.addActionListener(myActionListener2);
 ​
         //设置替换编码
         textField.setEchoChar('*');
         pack();
         setVisible(true);
 ​
     }
 }
 class MyActionListener2 implements ActionListener{
     @Override
     public void actionPerformed(ActionEvent e) {
         TextField field = (TextField) e.getSource();//获得一些资源,返回一个对象
         System.out.println(field.getText());//获得输入框的内容
         field.setText("");//null ""
     }
 }

2.6、简易计算器,组合+内部类回顾复习!

oop原则:组合,大于继承!


 

目前代码:

 package com.kuang.lesson02;
 ​
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 ​
 //简易计算器
 public class TestCalc {
     public static void main(String[] args) {
         new Calculator();
     }
 }
 //计算器类
 class Calculator extends Frame{
     public Calculator(){
         //3个文本框
 ​
         TextField field1 = new TextField(10);//字符数
         TextField field2 = new TextField(10);
         TextField field3 = new TextField(20);
 ​
         //1个按钮
         Button button = new Button("=");
         button.addActionListener(new MyCalculatorListener(field1,field2,field3));
 ​
         //1个标签
         Label label = new Label("+");
 ​
         //布局
         setLayout(new FlowLayout());
 ​
         add(field1);
         add(label);
         add(field2);
         add(button);
         add(field3);
 ​
         pack();
         setVisible(true);
 ​
     }
 }
 //监听器类
 class MyCalculatorListener implements ActionListener{
     //获取三个变量
     private TextField field1,field2,field3;
 ​
     public MyCalculatorListener(TextField field1,TextField field2,TextField field3) {
         this.field1 = field1;
         this.field2 = field2;
         this.field3 = field3;
     }
 ​
     @Override
     public void actionPerformed(ActionEvent e) {
 ​
         //1.获得加数和被加数
         int n1 = Integer.parseInt(field1.getText());
         int n2 = Integer.parseInt(field2.getText());
 ​
         //2.将这个值 + 法运算后,放到第三个框
         field3.setText(""+(n1+n2));
         
         //3.清除前两个框
         field1.setText("");
         field2.setText("");
     }
 }

完全改造为面向对象写法

 package com.kuang.lesson02;
 ​
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 ​
 //简易计算器
 public class TestCalc {
     public static void main(String[] args) {
         new Calculator().loadFrame();
     }
 }
 //计算器类
 class Calculator extends Frame{
 ​
     TextField field1,field2,field3;
 ​
         public void loadFrame(){
 ​
         field1 = new TextField(10);//字符数
         field2 = new TextField(10);//字符数
         field3 = new TextField(20);//字符数
 ​
         Button button = new Button("=");
         button.addActionListener(new MyCalculatorListener(this));
 ​
         Label label = new Label("+");
 ​
         setLayout(new FlowLayout());
 ​
         add(field1);
         add(label);
         add(field2);
         add(button);
         add(field3);
 ​
         pack();
         setVisible(true);
 ​
     }
 }
 //监听器类
 class MyCalculatorListener implements ActionListener{
 ​
     Calculator calculator = null;
 ​
     public MyCalculatorListener(Calculator calculator) {
         this.calculator = calculator;
     }
 ​
     @Override
     public void actionPerformed(ActionEvent e) {
         //1.获得加数和被加数
         //2.将这个值 + 法运算后,放到第三个框
         //3.清除前两个框
 ​
         int n1 = Integer.parseInt(calculator.field1.getText());
         int n2 = Integer.parseInt(calculator.field2.getText());
         calculator.field3.setText(""+(n1+n2));
         calculator.field1.setText("");
         calculator.field2.setText("");
 ​
 ​
     }
 }

内部类:

  • 更好的包装

 package com.kuang.lesson02;
 ​
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 ​
 //简易计算器
 public class TestCalc {
     public static void main(String[] args) {
         new Calculator().loadFrame();
     }
 }
 //计算器类
 class Calculator extends Frame{
 ​
     TextField field1,field2,field3;
 ​
         public void loadFrame(){
 ​
         field1 = new TextField(10);//字符数
         field2 = new TextField(10);//字符数
         field3 = new TextField(20);//字符数
 ​
         Button button = new Button("=");
         button.addActionListener(new MyCalculatorListener());
 ​
         Label label = new Label("+");
 ​
         setLayout(new FlowLayout());
 ​
         add(field1);
         add(label);
         add(field2);
         add(button);
         add(field3);
 ​
         pack();
         setVisible(true);
 ​
     }
     //监听器类
     //内部类最大的好处,就是可以畅通无阻的访问外部类的属性和方法!
     private class MyCalculatorListener implements ActionListener{
 ​
         @Override
         public void actionPerformed(ActionEvent e) {
             //1.获得加数和被加数
             //2.将这个值 + 法运算后,放到第三个框
             //3.清除前两个框
 ​
             int n1 = Integer.parseInt(field1.getText());
             int n2 = Integer.parseInt(field2.getText());
             field3.setText(""+(n1+n2));
             field1.setText("");
             field2.setText("");
 ​
 ​
         }
     }
 }

2.7、画笔

 package com.kuang.lesson03;
 ​
 import java.awt.*;
 ​
 public class TestPaint {
     public static void main(String[] args) {
         new MyPaint().loadFrame();
     }
 }
 class MyPaint extends Frame{
     public void loadFrame(){
         setBounds(200,200,400,600);
         setVisible(true);
     }
 ​
     //画笔
     @Override
     public 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(150,200,200,200);
 ​
         //养成习惯,画笔用完,将它还原到最初的颜色
     }
 }

2.8、鼠标监听

 package com.kuang.lesson03;
 ​
 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("画图");
     }
 }
 //自己的类
 class MyFrame extends Frame{
     //画画需要画笔,需要监听鼠标当前的位置,需要集合来存储这个点
     ArrayList points;
     public MyFrame(String name){
         super("title");
         setBounds(200,200,400,300);
         //存鼠标点击的点
         points = new ArrayList<>();
 ​
         setVisible(true);
 ​
         //鼠标监听器,针对这个窗口
         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.green);
             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();//刷新    30帧   60帧
         }
     }
 }

2.9、窗口监听

 package com.kuang.lesson03;
 ​
 import java.awt.*;
 import java.awt.event.WindowAdapter;
 import java.awt.event.WindowEvent;
 ​
 public class TestWindow {
     public static void main(String[] args) {
         new WindowFrame();
     }
 }
 class WindowFrame extends Frame{
     public WindowFrame(){
         setBackground(Color.MAGENTA);
         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 source = (WindowFrame) e.getSource();
                         source.setTitle("激活成功!");
                         System.out.println("windowActivated");
 ​
                     }
                 }
         );
     }
 }

 

2.10、键盘监听

 package com.kuang.lesson03;
 ​
 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(){
         setBounds(1,2,300,200);
         setVisible(true);
 ​
         this.addKeyListener(new KeyAdapter() {
             //键盘按下
             @Override
             public void keyPressed(KeyEvent e) {
                 //获得键盘下的键是哪一个,当前的码
                 int keyCode = e.getKeyCode();//不需要去记录这个数值,直接使用静态属性VK_XXX
                 System.out.println(keyCode);
                 if (keyCode == KeyEvent.VK_UP){
                     System.out.println("你按下了上键");
                 }
                 //根据按下不同的键,产生不同的结果
             }
         });
     }
 }

 

3、Swing

3.1、窗口、面板

 package com.kuang.lesson04;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 public class JFrameDemo {
 ​
     //init(); 初始化
     public void init(){
         //顶级窗口
         JFrame jf = new JFrame("这是一个JFrame窗口");
         jf.setBounds(100,100,200,200);
         jf.setBackground(Color.cyan);
         jf.setVisible(true);
         //设置文字 JLabel
         JLabel label = new JLabel("欢迎来Java学习");
         jf.add(label);
         jf.pack();
 ​
         //关闭事件
         jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     }
 ​
 ​
     public static void main(String[] args) {
         //建立一个窗口
         new JFrameDemo().init();
     }
 }

标签居中

 package com.kuang.lesson04;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 public class JFrameDemo02 {
 ​
     public static void main(String[] args) {
         new MyJFrame().init();
     }
 ​
     static class MyJFrame extends JFrame{
 ​
         public void init(){
             this.setBounds(10,10,100,100);
             this.setVisible(true);
 ​
             JLabel label = new JLabel("欢迎来Java学习");
             this.add(label);
 ​
             //让文本标签居中   设置水平对齐
             label.setHorizontalAlignment(SwingConstants.CENTER);
 ​
             //得到一个容器
             Container contentPane = this.getContentPane();
             contentPane.setBackground(Color.GREEN);
         }
     }
 }

 

3.2、弹窗

 package com.kuang.lesson04;
 ​
 import javax.swing.*;
 import java.awt.*;
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
 ​
 public class DialogDemo extends JFrame {
     public DialogDemo() {
         this.setVisible(true);
         this.setSize(400,500);
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
 ​
         //JFrame 放东西,容器
         Container container = this.getContentPane();
         //绝对布局
         container.setLayout(null);
 ​
         //按钮
         JButton button = new JButton("点击弹出一个对话框");//创建对象
         button.setBounds(30,30,200,100);
 ​
         //点击这个按钮的时候,弹出一个弹窗
         button.addActionListener(new ActionListener() {//监听器
             @Override
             public void actionPerformed(ActionEvent e) {
                 //弹窗
                 new MyDialogDemo();
             }
         });
 ​
         container.add(button);
 ​
     }
 ​
     public static void main(String[] args) {
         new DialogDemo();
     }
 }
 //弹窗的窗口
 class MyDialogDemo extends JDialog{
     public MyDialogDemo() {
         this.setVisible(true);
         this.setBounds(100,100,500,500);
         //this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         //因为默认已经有了关闭事件如果添加则会报错: defaultCloseOperation must be one of: DO_NOTHING_ON_CLOSE, HIDE_ON_CLOSE, or DISPOSE_ON_CLOSE
 ​
         Container container = this.getContentPane();
         container.setLayout(null);
 ​
         container.add(new Label("秦老师带你学Java"));
     }
 }

 

3.3、标签

label

 new JLabel("xxx");

图标ICON

 package com.kuang.lesson04;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 //图标,需要实现类,Frame继承
 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(15, 15);
         //图标可以放在标签也可以放在按钮上!
         JLabel label = new JLabel("icontext", iconDemo, SwingConstants.CENTER);
 ​
         Container container = getContentPane();
         container.add(label);
 ​
         setVisible(true);
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
     }
 ​
 ​
 ​
     public static void main(String[] args) {
         new IconDemo().init();
     }
 ​
     @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;
     }
 }

图片Icon

 package com.kuang.lesson04;
 ​
 import javax.swing.*;
 import java.awt.*;
 import java.net.URL;
 ​
 public class ImageIconDemo extends JFrame {
 ​
     public ImageIconDemo() {
         //获得图片的地址   可以通过类名.class.获得当前路径下的图片
         JLabel label = new JLabel("ImageIconDemo");
         URL url = ImageIconDemo.class.getResource("tx.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,200,200);
     }
 ​
     public static void main(String[] args) {
         new ImageIconDemo();
     }
 }

 

3.4、面板

JPanel

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 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));
         JPanel panel2 = new JPanel(new GridLayout(1,2));
         JPanel panel3 = new JPanel(new GridLayout(2,1));
         JPanel panel4 = new JPanel(new GridLayout(3,2));
 ​
         panel1.add(new JButton("1"));
         panel1.add(new JButton("1"));
         panel1.add(new JButton("1"));
         panel2.add(new JButton("2"));
         panel2.add(new JButton("2"));
         panel3.add(new JButton("3"));
         panel3.add(new JButton("3"));
         panel4.add(new JButton("4"));
         panel4.add(new JButton("4"));
         panel4.add(new JButton("4"));
         panel4.add(new JButton("4"));
         panel4.add(new JButton("4"));
         panel4.add(new JButton("4"));
 ​
 ​
 ​
         container.add(panel1);
         container.add(panel2);
         container.add(panel3);
         container.add(panel4);
 ​
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         this.setVisible(true);
         this.setSize(500,500);
     }
 ​
     public static void main(String[] args) {
         new JPanelDemo();
     }
 }

JScrollPanel

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 public class JScrollDemo extends JFrame {
 ​
     public JScrollDemo() {
         Container container = this.getContentPane();
 ​
         //文本域
         JTextArea textArea = new JTextArea();
         textArea.setText("欢迎学习狂神说Java");
 ​
         //Scroll面板
         JScrollPane scrollPane = new JScrollPane(textArea);
         container.add(scrollPane);
 ​
         this.setVisible(true);
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         this.setBounds(100,100,300,500);
     }
 ​
     public static void main(String[] args) {
         new JScrollDemo();
     }
 }

 

3.5、按钮

图片按钮

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 import java.net.URL;
 ​
 public class JButtonDemo01 extends JFrame {
 ​
     public JButtonDemo01() {
 ​
         Container container = this.getContentPane();
         //将一个图片变为图标
         URL resource = JButtonDemo01.class.getResource("tx.jpg");
         Icon icon = new ImageIcon(resource);
 ​
         //把这个图标放在按钮上
         JButton button = new JButton();
         button.setIcon(icon);
         button.setToolTipText("图片提示");
 ​
         //add
         container.add(button);
 ​
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         this.setSize(500,300);
         this.setVisible(true);
     }
 ​
     public static void main(String[] args) {
         new JButtonDemo01();
     }
 }

单选按钮

 package com.kuang.lesson05;
 ​
 import javafx.scene.control.RadioButton;
 ​
 import javax.swing.*;
 import java.awt.*;
 import java.net.URL;
 ​
 public class JButtonDemo02 extends JFrame {
 ​
     public JButtonDemo02() {
 ​
         Container container = this.getContentPane();
         //将一个图片变为图标
         URL resource = JButtonDemo01.class.getResource("tx.jpg");
         Icon icon = new ImageIcon(resource);
 ​
         //单选框
         JRadioButton radioButton1 = new JRadioButton("radioButton1");
         JRadioButton radioButton2 = new JRadioButton("radioButton2");
         JRadioButton radioButton3 = new JRadioButton("radioButton3");
 ​
         //由于单选框只能选择一个,分组,一个组只能选择一个
         ButtonGroup group = new ButtonGroup();
         group.add(radioButton1);
         group.add(radioButton2);
         group.add(radioButton3);
 ​
         container.add(radioButton1,BorderLayout.CENTER);
         container.add(radioButton2,BorderLayout.NORTH);
         container.add(radioButton3,BorderLayout.SOUTH);
 ​
 ​
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         this.setSize(500,300);
         this.setVisible(true);
     }
 ​
     public static void main(String[] args) {
         new JButtonDemo02();
     }
 }

复选按钮

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 import java.net.URL;
 ​
 public class JButtonDemo03  extends JFrame {
 ​
     public JButtonDemo03() {
 ​
         Container container = this.getContentPane();
         //将一个图片变为图标
         URL resource = JButtonDemo01.class.getResource("tx.jpg");
         Icon icon = new ImageIcon(resource);
 ​
         //多选框
         JCheckBox checkBox01 = new JCheckBox("checkBox01");
         JCheckBox checkBox02 = new JCheckBox("checkBox02");
 ​
         container.add(checkBox01,BorderLayout.NORTH);
         container.add(checkBox02,BorderLayout.SOUTH);
 ​
 ​
 ​
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         this.setSize(500,300);
         this.setVisible(true);
     }
 ​
     public static void main(String[] args) {
         new JButtonDemo03();
     }
 }

 

3.6、列表

  • 下拉框

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 public class TestComboBoxDemo01 extends JFrame {
 ​
     public TestComboBoxDemo01() {
 ​
         Container container = getContentPane();
 ​
         JComboBox comboBox = new JComboBox();
         comboBox.addItem(null);
         comboBox.addItem("正在热映");
         comboBox.addItem("已下架");
         comboBox.addItem("即将上映");
 ​
         container.add(comboBox);
 ​
         setVisible(true);
         setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         setSize(300,400);
     }
 ​
     public static void main(String[] args) {
         new TestComboBoxDemo01();
     }
 }
  • 列表框

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 import java.util.Vector;
 ​
 public class TestComboBoxDemo02 extends JFrame {
 ​
     public TestComboBoxDemo02() {
 ​
         Container container = getContentPane();
 ​
         //生成列表的内容
         //String[] contents = {"1","2","3"};
 ​
         Vector contents = new Vector();
 ​
         //列表中需要放入内容
         JList jList = new JList(contents);
 ​
         contents.add("zhangsan");
         contents.add("lisi");
         contents.add("wangwu");
 ​
         container.add(jList);
 ​
         setVisible(true);
         setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         setSize(300,400);
     }
 ​
     public static void main(String[] args) {
         new TestComboBoxDemo02();
     }
 }
  • 应用场景

    • 选择地区,或者一些单个选项

    • 列表,展示信息,一般都是动态扩容!

 

3.7、文本框

  • 文本框

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 //文本框
 public class TestTextDemo01 extends JFrame {
 ​
     public TestTextDemo01() {
 ​
         Container container = getContentPane();
 ​
         JTextField textField = new JTextField("HELLO");
         JTextField textField1 = new JTextField("WORLD");
 ​
         container.add(textField,BorderLayout.NORTH);
         container.add(textField1,BorderLayout.SOUTH);
 ​
         setVisible(true);
         setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         setSize(300,400);
     }
 ​
     public static void main(String[] args) {
         new TestTextDemo01();
     }
 }
  • 密码框

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 //密码框
 public class TestTextDemo02 extends JFrame {
 ​
     public TestTextDemo02() {
 ​
         Container container = getContentPane();
 ​
         //面板
         JPasswordField passwordField = new JPasswordField();
         passwordField.setEchoChar('*');
 ​
         container.add(passwordField);
 ​
         setVisible(true);
         setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         setSize(300,400);
     }
 ​
     public static void main(String[] args) {
         new TestTextDemo02();
     }
 }
  • 文本域

 package com.kuang.lesson05;
 ​
 import javax.swing.*;
 import java.awt.*;
 ​
 public class JScrollDemo extends JFrame {
 ​
     public JScrollDemo() {
         Container container = this.getContentPane();
 ​
         //文本域
         JTextArea textArea = new JTextArea();
         textArea.setText("欢迎学习狂神说Java");
 ​
         //Scroll面板
         JScrollPane scrollPane = new JScrollPane(textArea);
         container.add(scrollPane);
 ​
         this.setVisible(true);
         this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         this.setBounds(100,100,300,500);
     }
 ​
     public static void main(String[] args) {
         new JScrollDemo();
     }
 }

贪吃蛇


帧,如果时间片足够小,就是动画,一秒30帧 60帧。连起来就是动画,拆开就是静态的图片!

键盘监听!

定时器 Timer


思路:

img

  • 小蛇

    • 分辨率为25*25

      • 头部,一共有上下左右4个方向

        • up.png

                   

        • down.png

                   

        • left.png

                   

        • right.png

                   

    • 身体,使用绿色小方块

      • body.png

                     

    • 食物

      • 使用蓝色小圆点,分辨率为25*25

      • food.png

                             

 

游戏主启动类

 package com.kuang.snake;
 ​
 import javax.swing.*;
 ​
 //游戏主启动类
 public class StartGame {
     public static void main(String[] args) {
         JFrame frame = new JFrame();
 ​
         frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
         frame.setBounds(10,10,900,750);
         frame.setResizable(false);
 ​
         //正常游戏界面都应该在面上!
         frame.add(new GamePanel());
 ​
         frame.setVisible(true);
     }
 }

数据中心

 package com.kuang.snake;
 ​
 import javax.swing.*;
 import java.net.URL;
 ​
 //数据中心
 public class Date {
 ​
     //相对路径  tx.png
     //绝对路径  /   相当于当前的项目
     public static URL headerURL = Date.class.getResource("statics/header.png");
     public static ImageIcon header = new ImageIcon(headerURL);
     public static URL upURL = Date.class.getResource("statics/up.png");
     public static ImageIcon up = new ImageIcon(upURL);
     public static URL downURL = Date.class.getResource("statics/down.png");
     public static ImageIcon down = new ImageIcon(downURL);
     public static URL leftURL = Date.class.getResource("statics/left.png");
     public static ImageIcon left = new ImageIcon(leftURL);
     public static URL rightURL = Date.class.getResource("statics/right.png");
     public static ImageIcon right = new ImageIcon(rightURL);
     public static URL bodyrURL = Date.class.getResource("statics/body.png");
     public static ImageIcon body = new ImageIcon(bodyrURL);
     public static URL foodURL = Date.class.getResource("statics/food.png");
     public static ImageIcon food = new ImageIcon(foodURL);
 ​
 }

游戏的面板

 package com.kuang.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坐标 25*25
     int[] snakeY = new int[500];//蛇的Y坐标 25*25
     String fx ;//方向
 ​
     //食物的坐标
     int foodx;
     int foody;
     Random random =  new Random();
 ​
     int score;//成绩
 ​
     //游戏当前的状态:开始, 停止
     boolean isStart = false;//默认是不开始!
 ​
     boolean isFail = false;//游戏状态失败!
 ​
     //定时器  以ms为单位 1000ms = 1s
     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] = 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);
 ​
         score = 0;
     }
 ​
 ​
     //绘制面板,我们游戏中的所有东西,都是用这个画笔来画
     @Override
     protected void paintComponent(Graphics g) {
         super.paintComponent(g);//清屏
         //绘制静态的面板
         this.setBackground(Color.WHITE);
         Date.header.paintIcon(this,g,25,11);//头部的广告栏画上去
         g.fillRect(25,75,850,600);//默认的游戏界面
 ​
         //画积分
         g.setColor(Color.white);
         g.setFont(new Font("微软雅黑",Font.BOLD,18));
         g.drawString("长度"+length,750,35);
         g.drawString("分数"+score,750,50);
 ​
         //画食物
         Date.food.paintIcon(this,g,foodx,foody);
 ​
         //把小蛇画上去
         if (fx.equals("R")){
             Date.right.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头 初始化向右
         }else if (fx.equals("L")){
             Date.left.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头 初始化向左
         }else if (fx.equals("D")){
             Date.down.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头 初始化向下
         }else if (fx.equals("U")){
             Date.up.paintIcon(this,g,snakeX[0],snakeY[0]);//蛇头 初始化向上
         }
 ​
         for (int i = 1; i < length; i++) {
             Date.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){
             g.setColor(Color.red);
             g.setFont(new Font("微软雅黑",Font.BOLD,40));//设置字体
             g.drawString("失败,按下空格重新开始",300,300);
         }
     }
 ​
     //键盘监听事件
     @Override
     public void keyPressed(KeyEvent e) {
         int keyCode = e.getKeyCode();//获得键盘按键是哪一个
         if (keyCode == 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";
         }
 ​
 ​
     }
 ​
     //事件监听--需啊哟通过固定事件来刷新,1s = 10次
     @Override
     public void actionPerformed(ActionEvent e) {
         if (isStart && isFail == false){//如果游戏时开始状态,就让小蛇动起来!
 ​
             //吃食物
             if (snakeX[0] == foodx && snakeY[0] ==foody){
                 //长度+1
                 length++;
                 //分数加10
                 score+=10;
 ​
                 //再次随机食物
                 foodx = 25 +25*random.nextInt(34);
                 foody = 75 +25*random.nextInt(24);
             }
 ​
 ​
             //移动
             for (int i = length-1; i > 0 ; i--) {//后一节移到前一节的位置 snakeX[1] = snakeX[0]
                 snakeX[i] = snakeX[i-1];
                 snakeY[i] = snakeY[i-1];
             }
             //走向
             if (fx.equals("R")){
                 snakeX[0] = snakeX[0]+25;
                 if (snakeX[0]>850){snakeX[0] = 25;} //边界判断
             }else if (fx.equals("L")){
                 snakeX[0] = snakeX[0]-25;
                 if (snakeX[0]<25){snakeX[0] = 850;} //边界判断
             }else if (fx.equals("U")){
                 snakeY[0] = snakeY[0]-25;
                 if (snakeY[0]<75){snakeY[0] = 650;} //边界判断
             }else if (fx.equals("D")){
                 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;
                 }
             }
 ​
 ​
 ​
             repaint();//重置页面
 ​
         }
         timer.start();
     }
 ​
 ​
     @Override
     public void keyReleased(KeyEvent e) {
 ​
     }
 ​
     @Override
     public void keyTyped(KeyEvent e) {
 ​
     }
 ​
 }
posted @ 2022-01-22 18:12  nakano_may  阅读(56)  评论(0编辑  收藏  举报