前端-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

image-20210719134216649

2.2组件和容器

1.frame
package gui;

import java.awt.*;

//GUI的第一个界面
public class TextFrame {
   public static void main(String[] args) {

       //Frame对象   看源码
       Frame frame = new Frame("我的第一个java图形窗口");

       //需要设置可见性
       frame.setVisible(true);

       //设置窗口大小
       frame.setSize(400,400);

       //设置颜色 Color
       frame.setBackground(new Color(39, 75, 153, 91));

       //弹出的初始位置
       frame.setLocation(200,200);

       //设置大小固定
       frame.setResizable(false);
  }

}

多个界面

package gui;

import java.awt.*;

public class TestFrame2 {
   public static void main(String[] args) {
       //多个窗口
       MyFrame myFrame1 = new MyFrame(100, 100, 200, 200, Color.blue);
       MyFrame myFrame2 = new MyFrame(300, 100, 200, 200, Color.blue);
       MyFrame myFrame3 = new MyFrame(500, 100, 200, 200, Color.blue);
       MyFrame myFrame4 = new MyFrame(700, 100, 200, 200, Color.blue);
  }
}

class MyFrame extends Frame{
   static int id=0;//可能存在多个窗口,我们需要一个计算器

   public MyFrame(int x,int y,int w,int h,Color color){
       super("Myframe"+(++id));

       setVisible(true);
       setBounds(x,y,w,h);
       setBackground(color);

  }
}
2.面板Panel

解决了关闭事件!

package gui;

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

//面板Panel,可以看成时一个空间,不能单独存在
public class TestPanel {
   public static void main(String[] args) {
       Frame frame = new Frame();
       //布局的概念
       Panel panel = new Panel();

       //设置布局
       frame.setLayout(null);

       //坐标
       frame.setBounds(300, 300, 500, 500);
       frame.setBackground(new Color(27, 60, 128));

       //panel设置坐标,相对于panel
       panel.setBounds(50, 50, 400, 400);
       panel.setBackground(new Color(23, 128, 126));

       //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 gui;

import java.awt.*;

public class TestFlowLayout {
   public static void main(String[] args) {
       Frame frame = new Frame();
       
       //组件-按钮
       Button button1 = new Button("button1");
       Button button2 = new Button("button2");
       Button button3 = new Button("button3");

       //设置为流式布局
       //frame.setLayout(new FlowLayout());
       //frame.setLayout(new FlowLayout(FlowLayout.LEFT));
       frame.setLayout(new FlowLayout(FlowLayout.RIGHT));

       frame.setSize(300,300);

       //添加按钮
       frame.add(button1);
       frame.add(button2);
       frame.add(button3);

       frame.setVisible(true);
  }
}
  • 东西南北中

package gui;

import java.awt.*;

public class TestBorderLayout {
   public static void main(String[] args) {
       Frame frame = new Frame();

       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(300,300);
       frame.setVisible(true);
  }
}
  • 表格布局 Grid

package gui;

import java.awt.*;

public class TestGridLatout {
   public static void main(String[] args) {
       Frame frame = new Frame();

       Button btn1 = new Button("btn1");
       Button btn2 = new Button("btn2");
       Button btn3 = new Button("btn3");
       Button btn4 = new Button("btn4");
       Button btn5 = new Button("btn5");
       Button btn6 = new Button("btn6");

       frame.setLayout(new GridLayout(3,2));

       frame.add(btn1);
       frame.add(btn2);
       frame.add(btn3);
       frame.add(btn4);
       frame.add(btn5);
       frame.add(btn6);

       frame.pack();//java函数!自动布局
       frame.setVisible(true);


  }
}

image-20210719164342089

代码实现:

package gui;

import java.awt.*;

public class LX {
   public static void main(String[] args) {
       Frame frame = new Frame();
       frame.setLayout(new GridLayout(2,1));

       frame.setVisible(true);
       frame.setSize(500,400);
       frame.setLocation(500,600);
       frame.setBackground(new Color(1,1,1));
       //四个面板
       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));

       p1.add(new Button("East1"),BorderLayout.EAST);
       p1.add(new Button("West1"),BorderLayout.WEST);

       p2.add(new Button("p2-t"));
       p2.add(new Button("p2-d"));

       p1.add(p2,BorderLayout.CENTER);

       p3.add(new Button("East2"),BorderLayout.EAST);
       p3.add(new Button("West2"),BorderLayout.WEST);

       for (int i = 0; i <4 ; i++) {
           p4.add(new Button("p4-"+i));
      }

       p3.add(p4,BorderLayout.CENTER);

       frame.add(p1);
       frame.add(p3);
  }
}

 

总结:

  1. Frame是一个顶级窗口

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

  3. 布局管理器

    1. 流式

    2. 东西南北中

    3. 表格

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

4.事件监听

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

package gui;

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,所有我们需要构造一个

       MyActionListener myActionListener=new MyActionListener();
       button.addActionListener(myActionListener);

       frame.add(button,BorderLayout.CENTER);
       frame.pack();

       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 MyActionListener implements ActionListener{

   @Override
   public void actionPerformed(ActionEvent e) {
       System.out.println("aaa");
  }
}

多个按钮共享一个是事件

package gui;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestAction2 {
   public static void main(String[] args) {
       //两个按钮实现同一个监听
       //开始   停止

       Frame frame = new Frame("开始     停止");

       Button btn1 = new Button("start");
       Button btn2 = new Button("end");
       //多个按钮只写一个监听类
       btn2.setActionCommand("btn-stop");

       MyMonitor myMonitor = new MyMonitor();
       btn1.addActionListener(myMonitor);
       btn2.addActionListener(myMonitor);

       frame.add(btn1,BorderLayout.NORTH);
       frame.add(btn2,BorderLayout.SOUTH);

       frame.pack();
       frame.setVisible(true);
  }
}

class MyMonitor implements ActionListener{

   @Override
   public void actionPerformed(ActionEvent e) {
       //e.getActionCommand()获取按钮的信息
       System.out.println("点击"+e.getActionCommand());
       if (e.getActionCommand().equals("start")){
           
      }
  }
}
5.输入框TextFiled 监听
package gui;

import OOP.demo5.A;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class TestText1 {
   public static void main(String[] args) {
       //启动!
       new MyFrame1();
  }
}

class MyFrame1 extends Frame{
   public MyFrame1(){
       TextField textField = new TextField();
       add(textField);

       //监听文本框输入的文字
       MyActionListener2 myActionListener2 = new MyActionListener2();
       //按下回车就会触发这个输入框的事件
       textField.addActionListener(myActionListener2);

       //设置替换编码
       textField.setEchoChar('*');

       setVisible(true);
       pack();

  }
}

class MyActionListener2 implements ActionListener{

   @Override
   public void actionPerformed(ActionEvent e) {
      TextField field=(TextField) e.getSource();//获得一些资源
       System.out.println(field.getText());//获得输入框中的文本
       field.setText("");
  }
}
6.简易计算器,组合+内部类回顾复习!

oop原则:组合大于继承!

class A extends B{
   
}

class A{
   public B b;
}

目前代码

package gui;

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(){
       //三个文本框
       TextField num1 = new TextField(10);
       TextField num2 = new TextField(10);
       TextField num3 = new TextField(20);
       //一个按钮
       Button button = new Button("=");

       button.addActionListener(new MyCalListenter(num1,num2,num3));

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

       //布局
       setLayout(new FlowLayout());

       add(num1);
       add(label);
       add(num2);
       add(button);
       add(num3);

       pack();
       setVisible(true);

  }
}

//监听器类
class MyCalListenter implements ActionListener{

   //获取三个变量
   private TextField num1,num2,num3;

   public MyCalListenter(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("");
  }
}

完全改造为面向对象写法

package gui;

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 num1,num2,num3;

   //方法
   public void loadFrame(){
       num1 = new TextField(10);
       num2 = new TextField(10);
       num3 = new TextField(20);
       Button button = new Button("=");
       Label label = new Label("+");

       button.addActionListener(new MyCalListenter(this));

       //布局
       setLayout(new FlowLayout());

       add(num1);
       add(label);
       add(num2);
       add(button);
       add(num3);

       pack();
       setVisible(true);
  }
}

//监听器类
class MyCalListenter implements ActionListener{

   //获取计算器这个对象,在一个类中组合另一个类
   Calculator calculator=null;

   public MyCalListenter(Calculator calculator){
       this.calculator=calculator;
  }
   @Override
   public void actionPerformed(ActionEvent e) {
       //获得两个加数
       //将这个值+运算后放到第三个框
       //清除前两个框
       int n1 = Integer.parseInt(calculator.num1.getText());
       int n2 = Integer.parseInt(calculator.num2.getText());
       calculator.num3.setText("+"+(n1+n2));
       calculator.num1.setText("");
       calculator.num2.setText("");

  }
}

内部类:

  • 更好的包装

package gui;

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 num1,num2,num3;

   //方法
   public void loadFrame(){
       num1 = new TextField(10);
       num2 = new TextField(10);
       num3 = new TextField(20);
       Button button = new Button("=");
       Label label = new Label("+");

       button.addActionListener(new MyCalListenter());

       //布局
       setLayout(new FlowLayout());

       add(num1);
       add(label);
       add(num2);
       add(button);
       add(num3);

       pack();
       setVisible(true);
  }
   //监听器类
   //内部类最大的好处,就是可以畅通无阻的访问外部的属性和方法!
    private class MyCalListenter 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("");

      }
  }
}
7.画笔
package gui;

import java.awt.*;

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

class Mypaint extends Frame{

   public void loadFrame(){
       setVisible(true);
       setBounds(200,200,600,400);
  }

   //画笔
   @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.BLUE);
       g.fillRect(200,200,100,100);

       //养成习惯,画笔用完,还原到最初的颜色
       
  }
}
8.鼠标监听

目的:想要实现鼠标画画!

package gui;

import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Iterator;

//测试鼠标监听事件
public class TestMouseListener {
   public static void main(String[] args) {
       new MyFrame3("画图");
  }
}

class MyFrame3 extends Frame{
   //画画需要画笔,需要监听鼠标当前的位置
   //需要集合存储这个点
   ArrayList points;

   public MyFrame3(String title) {
       super(title);
       setBounds(300,300,500,600);

       //存鼠标点击的点
       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.BLACK);
           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) {
           MyFrame3 myFrame3 =(MyFrame3) e.getSource();
           //这里我们点击的时候就会在界面上产生一个点!画
           //这个点就是鼠标的点
           myFrame3.addPaint(new Point(e.getX(),e.getY()));

           //每次点击鼠标都需要重新画一遍
           myFrame3.repaint();//刷新
      }
  }
}
9.窗口监听
package gui;

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

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

class WindowFrame extends Frame{
   public WindowFrame(){
       setBounds(200,200,500,400);
       setBackground(Color.blue);
       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");
                  }
              }
      );
  }

}
1.0键盘监听
package gui;

import javafx.scene.input.KeyCode;

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(){
       super();

       setBounds(50,50,600,700);
       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 gui.Jframe;

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

public class JFrameDemo {
   //init()初始化
   public void init(){
       //顶级窗口
       JFrame jf = new JFrame("这是一个JFrame窗口");
       jf.setVisible(true);
       jf.setBounds(100,100,200,200);
       jf.setBackground(Color.cyan);
       //设置文字 JLable

       JLabel label = new JLabel("欢迎来到java");

       jf.add(label);
       
       //关闭事件
       jf.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

   public static void main(String[] args) {
       new JFrameDemo().init();
  }
}

标签居中

package gui.Jframe;

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

public class JFrameDemo2 {
   public static void main(String[] args) {
       new Myjframe2().init();
  }
}

class Myjframe2 extends JFrame{
   public void init(){
       this.setBounds(20,20,200,200);
       this.setVisible(true);

       JLabel label = new JLabel("欢迎来到java");

       this.add(label);

       //文本标签居中
       label.setHorizontalAlignment(SwingConstants.CENTER);

       //获得一个容器
       Container contentPane = this.getContentPane();
       contentPane.setBackground(Color.BLUE);
  }
}

3.2弹窗

JDialog,用来被弹出,默认就有关闭事件!

package gui.Jframe;

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

//主窗口
public class DialogDemo extends JFrame {

   public DialogDemo(){
       this.setVisible(true);
       this.setSize(700,500);
       //this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       //JFrame放东西,容器
       Container container=this.getContentPane();

       //绝对布局
       container.setLayout(null);

       //按钮
       JButton jButton = new JButton("点击弹出对话框");//创建
       jButton.setBounds(30,30,200,50);
       //点击按钮的时候弹出弹窗
       jButton.addActionListener(new AbstractAction() {
           @Override
           public void actionPerformed(ActionEvent e) {
               //弹窗
               new MyDialogDemo();
          }
      });

       container.add(jButton);


  }

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

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

       contentPane.add(new Label("带你学java"));
  }
}

3.3 标签

label

new Label("XXX");

图标 ICON

package gui.Jframe;

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(10, 10);
       //图标放在标签,也可以放在按钮上
       JLabel label = new JLabel("incontest", iconDemo, SwingConstants.CENTER);

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

       this.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 gui.Jframe;

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

public class ImageIconDemo extends JFrame {
   public ImageIconDemo(){
       //获取图片地址
       JLabel label = new JLabel("ImageIcon");
       URL url = ImageIconDemo.class.getResource("t.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 gui.Jframe;

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(2,3));

       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.setVisible(true);
       this.setSize(500,500);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

  }

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

JScrollPanel

package gui.Jframe;

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

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

       //文本域
       JTextArea textArea = new JTextArea(20, 50);
       textArea.setText("欢迎学习");

       //SCroll面板
       JScrollPane scrollPane = new JScrollPane(textArea);
       container.add(scrollPane);

       this.setVisible(true);
       this.setBounds(100,100,300,350);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

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

3.5按钮

图片按钮

package gui.Jframe;

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

public class ButtonDemo1 extends JFrame {

   public ButtonDemo1(){
       Container container = this.getContentPane();
       //将图片变为图标
       URL url = ButtonDemo1.class.getResource("t.jpg");
       Icon icon = new ImageIcon(url);

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

       //add
       container.add(button);

       this.setVisible(true);
       this.setSize(500,300);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


  }

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

单选按钮

package gui.Jframe;

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

public class JButtonDemo2 extends JFrame {

   public JButtonDemo2(){
       Container container = this.getContentPane();
       //将图片变为图标
       URL url = ButtonDemo1.class.getResource("t.jpg");
       Icon icon = new ImageIcon(url);


         //单选框
       JRadioButton radioButton01 = new JRadioButton("JRadioButton01");
       JRadioButton radioButton02 = new JRadioButton("JRadioButton02");
       JRadioButton radioButton03 = new JRadioButton("JRadioButton03");

       //由于单选框只能选择一个,分组,一个组中只能选择一个
       ButtonGroup group = new ButtonGroup();
       group.add(radioButton01);
       group.add(radioButton02);
       group.add(radioButton03);

       container.add(radioButton01,BorderLayout.CENTER);
       container.add(radioButton02,BorderLayout.NORTH);
       container.add(radioButton03,BorderLayout.SOUTH);

       this.setVisible(true);
       this.setSize(500,300);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


  }

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

复选按钮

package gui.Jframe;

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

public class JButtonDemo3 extends JFrame {

   public JButtonDemo3(){
       Container container = this.getContentPane();
       //将图片变为图标
       URL url = ButtonDemo1.class.getResource("t.jpg");
       Icon icon = new ImageIcon(url);

       //多选框
       JCheckBox checkBox01 = new JCheckBox("checkBox01");
       JCheckBox checkBox02 = new JCheckBox("checkBox02");

       container.add(checkBox01,BorderLayout.NORTH);
       container.add(checkBox02,BorderLayout.SOUTH);


       this.setVisible(true);
       this.setSize(500,300);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);


  }

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

3.6 列表

下拉框

package gui.Jframe;

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

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(500,350);
       this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }

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

列表框

package gui.Jframe;

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

public class TestComboboxDemo2 extends JFrame {
   public TestComboboxDemo2(){

       Container container = this.getContentPane();

       //生成列表的内容 稀疏数组,压缩数据
//       String[] contents={"1","2","3"};

       Vector contents=new Vector();
       //列表中需要放入内容
       JList jList = new JList(contents);

       contents.add("11");
       contents.add("12");
       contents.add("13");
       
       container.add(jList);


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

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

应用场景

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

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

3.7 文本框

文本框

package gui.Jframe;

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

public class TestTextDemo1 extends JFrame {
   public TestTextDemo1(){

       Container container = this.getContentPane();

       JTextField textField = new JTextField("hello");
       JTextField textField2 = new JTextField("world",20);

       container.add(textField,BorderLayout.NORTH);
       container.add(textField2,BorderLayout.SOUTH);


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

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

密码框

package gui.Jframe;

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

public class TestTextDemo2 extends JFrame {
   public TestTextDemo2(){

       Container container = this.getContentPane();

       JPasswordField passwordField = new JPasswordField();
       passwordField.setEchoChar('*');

       container.add(passwordField);


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

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

文本域

package gui.Jframe;

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

public class TestTextDemo3 extends JFrame {
   public TestTextDemo3(){

       Container container = this.getContentPane();

       //文本域
       JTextArea textArea = new JTextArea(20, 50);
       textArea.setText("欢迎学习");

       //SCroll面板
       JScrollPane scrollPane = new JScrollPane(textArea);
       container.add(scrollPane);


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

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

贪吃蛇

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

键盘监听

定时器 Timer

startgame

package gui.snake;

import javax.swing.*;

//游戏的主启动类
public class StartGame {
   public static void main(String[] args) {
       JFrame frame=new JFrame();
       frame.setBounds(100,100,900,720);
       frame.setResizable(false);//窗口大小不可变
       frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

       //正常游戏界面都应该在面上!
       frame.add(new GamePanel());

       frame.setVisible(true);
  }
}

gamepanel

package gui.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坐标,50*50
   int[] snakeY = new int[500];//蛇的X坐标,50*50
   String fx;//初始方向向右

   //食物的坐标
   int foodx;
   int foody;
   Random random=new Random();

   int score;//成绩

   boolean isStart = false;  //默认是不开始

   boolean isFall=false;  //游戏失败

   //定时器,以毫秒为单位 1000ms=1s
   Timer timer=new Timer(100,this);//100毫秒执行一次


   //构造器
   public GamePanel(){
       init();
       //获得焦点和键盘事件
       this.setFocusable(true);//获得焦点事件
       this.addKeyListener(this);
  }


   //初始化方法
   public void init(){
       length = 3;
       snakeX[0]= 100;snakeY[0]= 100;//脑袋
       snakeX[1]= 75;snakeY[1]= 100;//第一个身体
       snakeX[2]= 50;snakeY[2]= 100;//第二个身体
       fx  ="R";
       timer.start();//游戏一开始定时器就启动

       //把食物随机刷新到界面上
       foodx=25+25*random.nextInt(34);
       foody=75+25*random.nextInt(24);

       score=0;

  }

   //绘制画板,我们游戏中的所有东西,都是用这个画笔来画

   @Override
   public void paintComponent(Graphics g) {
       super.paintComponent(g);//清屏
       //绘制静态面板
       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,18));
       g.drawString("长度"+length,750,35);
       g.drawString("分数"+score,750,50);

       Data.food.paintIcon(this,g,foodx,foody);

       //把小蛇画上去
       if (fx.equals("R")){
           Data.right.paintIcon(this,g,snakeX[0],snakeY[0]);//需要通过方向来判断
      }else if (fx.equals("L")){
           Data.left.paintIcon(this,g,snakeX[0],snakeY[0]);//需要通过方向来判断
      }else if(fx.equals("U")){
           Data.up.paintIcon(this,g,snakeX[0],snakeY[0]);//需要通过方向来判断
      }else if(fx.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 (isFall){
           g.setColor(Color.red);
           g.setFont(new Font("微软雅黑",Font.BOLD,40));
           g.drawString("失败,按下空格重新开始",300,500);
      }

  }

   //键盘监听事件
   @Override
   public void keyPressed(KeyEvent e) {
       int keyCode = e.getKeyCode();//获得键盘

       if (keyCode==KeyEvent.VK_SPACE){
           if (isFall){
               isFall=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 && isFall==false){//如果游戏开始状态,小蛇开始动

           //吃食物
           if (snakeX[0]==foodx && snakeY[0]==foody){
               length++;
               //加分加十
               score=score+10;
               //再次随机食物
               foodx=25+25*random.nextInt(34);
               foody=75+25*random.nextInt(24);
          }

           //移动
           for (int i = length-1; i >0 ; i--) {//后一节移到前一节的位置
               snakeX[i]=snakeX[i-1];//向前移动一节
               snakeY[i]=snakeY[i-1];
          }

           //走向
           if (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]){
                   isFall=true;
              }
          }


           repaint();

      }
       timer.start();//定时器开启
  }





   @Override
   public void keyReleased(KeyEvent e) {

  }
   @Override
   public void keyTyped(KeyEvent e) {

  }

}

data

package gui.snake;

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

//数据中心
public class Data {

   //相对路径 tx。jpg
   //绝对路径 /   相当于当前的项目
   public static URL headerURL = Data.class.getResource("statics/header.png");
   public static ImageIcon header = new ImageIcon(headerURL);

   public static URL upURL = Data.class.getResource("statics/up.png");
   public static URL rightURL = Data.class.getResource("statics/right.png");
   public static URL downURL = Data.class.getResource("statics/down.png");
   public static URL leftURL = Data.class.getResource("statics/left.png");
   public static ImageIcon up = new ImageIcon(upURL);
   public static ImageIcon right = new ImageIcon(rightURL);
   public static ImageIcon down = new ImageIcon(downURL);
   public static ImageIcon left = new ImageIcon(leftURL);

   public static URL bodyURL = Data.class.getResource("statics/body.png");
   public static ImageIcon body = new ImageIcon(bodyURL);

   public static URL foodURL = Data.class.getResource("statics/food.png");
   public static ImageIcon food = new ImageIcon(foodURL);


}

 

posted @ 2021-07-22 19:53  y4396  阅读(80)  评论(0)    收藏  举报