GUI编程

组件

  • 窗口

  • 弹窗

  • 面板

  • 文本框

  • 列表框

  • 按钮

  • 图片

  • 监听事件

  • 鼠标

  • 键盘事件

  • 破解工具

 

1、简介

Gui的核心技术:Swing、AWT,

1、界面不美观

2、需要jre环境

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

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

5、了解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 frame = new Frame("我的第一个Java图像界面窗口");

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

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

      //设置背景颜色

      frame.setBackground(new Color(87, 178, 239));

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

      //设置大小固定,窗口不能拉大拉小
      frame.setResizable(false);
  }
}

image-20211030211409519

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

尝试回顾封装:

package com.zty.lesson01;

import java.awt.*;

public class TestFrame2 {
  public static void main(String[] args) {
      //展示多个窗口 new
      MyFrame myFrame1 = new MyFrame(100,100,200,200,Color.blue);
      MyFrame myFrame2 = new MyFrame(300,100,200,200,Color.yellow);
      MyFrame myFrame3 = new MyFrame(100,300,200,200,Color.red);
      MyFrame myFrame4 = 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);
  }
}

image-20211029205201664

2、面板Panel

解决了关闭事件!

package com.zty.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(40,161,35));

       //panel设置坐标,相对于frame
       panel.setBounds(50,50,400,400);
       panel.setBackground(new Color(193,15,60));

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

image-20211029212149339

3、布局管理器

  • 流式布局

package com.zty.lesson01;

import java.awt.*;

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

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

      frame.setSize(200,200);

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

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

package com.zty.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);

  }
}
  • 表格布局

package com.zty.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.zty.lesson01;

import javax.swing.border.Border;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

public class TestZtyLayout {

  public static void main(String[] args) {

      Frame frame = new Frame();

      frame.setSize(400,300);
      frame.setLocation(300,400);
      frame.setBackground(Color.BLACK);
      frame.setVisible(true);
      frame.setLayout(new GridLayout(2,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));

      //上面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);
      //中间四个
      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);
          }
      });

  }
}

 

image-20211031113806557

总结:

1.Frame是一个顶级窗口

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

3.布局管理器

1.流式

2.东西南北中

3.表格布局

 

4、事件监听

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

public class TestActionEvent {

  public static void main(String[] args) {
      //按按钮的的时候,触发事件
      Frame frame = new Frame();
      Button button = new Button();

      //因为addActionListener()需要一个ActionListener,所以我们需要构造一个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.addWindowFocusListener(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");
  }
}

多个按钮,共享一个事件

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) {
      //e.getActionCommand() 获得按钮的信息
      System.out.println("按钮被点击了"+e.getActionCommand());
      if(e.getActionCommand().equals("start")){

      }
  }
}

5、输入框TextField

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

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

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


//简易计算器
public class TestCalc {
  public static void main(String[] args) {

      new Calculator();
  }
}


//计算器类
class Calculator extends Frame{
  public Calculator(){
        //3 个文本框
      TextField num1 = new TextField(10);
      TextField num2 = new TextField(10);
      TextField num3 = new TextField(30);

      //1个按钮
      Button button = new Button("=");
      button.addActionListener(new MyCalculatorListener(num1,num2,num3));

      //1个标签
      Label label = new Label("+");
      //布局
      setLayout(new FlowLayout());

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

      pack();
      setVisible(true);

  }
}

//监听器类
class MyCalculatorListener implements ActionListener{
  //获取三个变量
  private TextField num1,num2,num3;
  public MyCalculatorListener(TextField num1,TextField num2,TextField num3) {
      this.num1 = num1;
      this.num2 = num2;
      this.num3 = num3;


  }

  @Override

  public void actionPerformed(ActionEvent e) {
          //1.获得加数和被加数
      int n1 = Integer.parseInt((num1.getText()));
      int n2 = Integer.parseInt((num2.getText()));
       
        //2.将这个值 + 法运算后,放到第三个框
          num3.setText(""+(n1+n2));

        //3.清除前两个框
      num1.setText("");
      num2.setText("");
  }
}

 

完全改造为面向对象写法

//简易计算器
public class TestCalc {
  public static void main(String[] args) {

      new Calculator().loadFrame();
  }
}


//计算器类
class Calculator extends Frame{
  //属性
  TextField num1,num2,num3;

  //方法
  public void loadFrame(){

      //3 个文本框
        num1 = new TextField(10);
        num2 = new TextField(10);
        num3 = new TextField(30);

      //1个按钮
      Button button = new Button("=");
      Label label = new Label("+");
      button.addActionListener(new MyCalculatorListener(this));


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

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

      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.num1.getText());
        int n2 = Integer.parseInt(calculator.num2.getText());
        calculator.num3.setText(""+(n1+n2));

      calculator.num1.setText("");
      calculator.num2.setText("");

  }
}

内部类:

  • 更好的包装

//简易计算器
public class TestCalc {
  public static void main(String[] args) {

      new Calculator().loadFrame();
  }
}


//计算器类
class Calculator extends Frame {
  //属性
  TextField num1, num2, num3;

  //方法
  public void loadFrame() {

      //3 个文本框
      num1 = new TextField(10);
      num2 = new TextField(10);
      num3 = new TextField(30);

      //1个按钮
      Button button = new Button("=");
      Label label = new Label("+");
      button.addActionListener(new MyCalculatorListener());


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

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

      pack();
      setVisible(true);
  }


  //监听器类
  //内部类最大的好处,就是可以畅想无阻的访问外部的属性和方法
  private class MyCalculatorListener implements ActionListener {
      @Override
      public void actionPerformed(ActionEvent e) {
          //1.获得加数和被加数
          // 2.将这个值 + 法运算后,放到第三个框
          //3.清除前两个框
          int n1 = Integer.parseInt(num1.getText());
          int n2 = Integer.parseInt(num2.getText());
          num3.setText("" + (n1 + n2));

          num1.setText("");
          num2.setText("");


      }
  }
}

 

7、画笔

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

  public void loadFrame(){
      setBounds(200,200,600,500);
      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);
       
      //养成习惯,画笔画完,将他还原到最初的颜色
  }
}

8、鼠标监听

目的:想要实现鼠标画画

//鼠标监听
public class TextMouseListener {
  public static void main(String[] args) {
          new MyFrame("画图");
  }
}

//自己的类

class MyFrame extends Frame{
  //画画需要画笔,需要监听鼠标当前的位置,需要几盒来存储这个点

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

      //鼠标监听器针对这个窗口
      this.addMouseListener(new MyMouseListener());
      setVisible(true);
  }

  @Override
  public void paint(Graphics g) {
      //哈u哈u,监听鼠标的事件
      Iterator iterator = points.iterator();
      while (iterator.hasNext()){
          Point point = (Point)iterator.next();
          g.setColor(Color.BLUE);
          g.fillOval(point.x,point.y,10,10);
      }

  }

  //添加一个点到界面上
  public void addPaint(Point point){
      points.add(point);

  }

  //适配器模式
  private class MyMouseListener extends MouseAdapter {
        //鼠标 按下 ,弹起 ,按住不放
      @Override
      public void mousePressed(MouseEvent e) {
          MyFrame myFrame =(MyFrame)e.getSource();
          //这个我们点击的时候,就会在街面上昌盛一个点!
          myFrame.addPaint(new Point(e.getX(),e.getY()));

          //每次点击鼠标都需要重新画一遍
          myFrame.repaint();//刷新
      }
  }
}

9、窗口监听

public class TestWindow {
  public static void main(String[] args) {
      new WindowFrame();
  }
}
class WindowFrame extends Frame {
  public WindowFrame() {
      setBackground(Color.blue);
      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");
                  }
              }
      );
  }


}

10、键盘监听

 

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

class KeyFrame extends Frame{
  public KeyFrame(){
      setBounds(1,2,300,400);
        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 窗口、面板

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);
    //设置文字 Jlabel
    JLabel label = new JLabel("欢迎来到我的世界");
    jf.add(label);


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

}
public static void main(String[] args) {
    //建立一个窗口
    new JFrameDemo().init();
}

}

 

标签居中

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

class MyJframe2 extends JFrame{
  public void init(){
      this.setVisible(true);
      this.setBounds(10,10,200,200);
      JLabel label = new JLabel("欢迎来到我的世界");
      this.add(label);

      //让文本标签居中 设置水平对齐
      label.setHorizontalAlignment(SwingConstants.CENTER);

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

3.2弹窗

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

图标ICON

图片Icon

//主窗口
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 button = new JButton("点击弹出一个对话框");
      button.setBounds(30,30,200,50);

      //点击这个按钮的时候,弹出一个弹窗
      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);

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

      container.add(new Label("我爱学JAVA"));
  }
}

3.3标签

label

new JLabel("xxxx");

public class ImageIconDemo extends JFrame {

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

      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面板

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

      panel1.add(new JButton("1"));
      panel1.add(new JButton("1"));
      panel1.add(new JButton("1"));

      container.add(panel1);

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



  public static void main(String[] args) {

      new JPanelDemo();
  }

}

JScrollPanel

public class JScrollDemo extends JFrame {

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


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

      //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按钮

图片按钮

public class JButtonDemo01 extends JFrame {

  public JButtonDemo01(){
      Container container = this.getContentPane();
      URL resource = JButtonDemo01.class.getResource("zty.png");
      Icon icon = new ImageIcon(resource);

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


      //add
      container.add(button);

      this.setVisible(true);
      this.setSize(30,300);
      this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }
  public static void main(String[] args) {
        new JButtonDemo01();
  }
}
  • 单选按钮

public class JButtonDemo02 extends JFrame{

  public JButtonDemo02(){
      Container container = this.getContentPane();
      URL resource = JButtonDemo02.class.getResource("zty.png");
      Icon icon = new ImageIcon(resource);

      //单选框
      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(30,300);
      this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }
  public static void main(String[] args) {
      new JButtonDemo02();
  }
}
  • 复选按钮

public class JButtonDemo03 extends JFrame{

  public JButtonDemo03(){
      Container container = this.getContentPane();
      //将一个图片变为图标
      URL resource = JButtonDemo03.class.getResource("zty.png");
      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.setVisible(true);
      this.setSize(30,300);
      this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
  }
  public static void main(String[] args) {
      new JButtonDemo03();
  }
}

3.6列表

  • 下拉框

public class TextComboxDemo01 extends JFrame {
  public TextComboxDemo01() {

      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 TextComboxDemo01();
  }

}
  • 列表框

  • public class TextComboxDemo02 extends JFrame {
      public TextComboxDemo02() {

          Container container = this.getContentPane();

          //生成列表的内容
          // String[] contents ={"1","2","3"};

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

          contents.add("afasdfa");
          contents.add("faaaa");
          contents.add("faew");



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

      }
  • 应用场景

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

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

 

3.7文本框

  • 文本框

public class TestTextDemo01 extends JFrame {
  public TestTextDemo01() {

      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 TestTextDemo01();
  }

}
  • 密码框

public class TestTextDemo03 extends JFrame {
  public TestTextDemo03() {

      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 TestTextDemo03();
  }
}
  • 文本域

public class JScrollDemo extends JFrame {

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


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

      //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();
  }
}

 

贪吃蛇

//游戏的主动类
public class StartGame {
  public static void main(String[] args) {
      JFrame frame = new JFrame();

      frame.setVisible(true);
      frame.setBounds(10,10,900,720);
      frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

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


  }
}
//数据中心
public class Data {

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

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

  public static ImageIcon up = new ImageIcon(upURL);
  public static ImageIcon down = new ImageIcon(downURL);
  public static ImageIcon left = new ImageIcon(leftURL);
  public static ImageIcon right = new ImageIcon(rightURL);

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

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

}
//游戏面板
public class GamePanel extends JPanel implements KeyListener, ActionListener {

  //定义蛇的数据结构
  int length;//蛇的长度
  int[]snakeX = new int[600];//蛇的x坐标
  int[]snakeY = new int[500];//蛇的y坐标
  String fx ;
  int score;

  //食物的坐标
  int foodx;
  int foody;
  Random random = new Random();
  //游戏当前的状态:开始 停止
  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] =100 ;snakeY[1] =100 ;//第一个身体的坐标
      snakeX[2] =100 ;snakeY[2] =100 ;//第二个身体的坐标
      fx = "R";//初始方向向右

      foodx =25+25*random.nextInt(34);
      foodx =75+25*random.nextInt(24);

      score = 0;

  }

  //绘制面板,我们游戏中所有的东西,都是用这个画笔来画
  @Override
  protected void paintComponent(Graphics g) {
      super.paintComponent(g);//清屏
      //绘制静态面板
      this.setBackground(Color.BLACK);
      Data.paint.paintIcon(this, g, 11, 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);
      //把小蛇放上去
      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 = 0; i < length; i++) {
              Data.body.paintIcon(this, g, snakeX[i], snakeY[i]);//第一个身体的坐标

          }
          Data.food.paintIcon(this,g,foodx,foody);
          //游戏状态
          if(isStart==false){
              g.setColor(Color.white);
              g.setFont(new Font("微软雅黑",Font.BOLD,40));
              g.drawString("按下空格开始游戏",300,300);
          }


          if(isFail){
              g.setColor(Color.white);
              g.setFont(new Font("微软雅黑",Font.BOLD,40));
              g.drawString("失败,按下空格开始游戏",300,300);
          }
      }



  }


  @Override
  public void keyTyped(KeyEvent e) {

  }

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

        if(keyCode==KeyEvent.VK_SPACE){
            if(isFail){
                //重新开始
                isFail = false;
                init();
            }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 keyReleased(KeyEvent e) {

  }
//事件监听---需要通过固定事件来刷新,1s=10次
  @Override
  public void actionPerformed(ActionEvent e) {
      if(isStart && isFail ==false){//如果游戏是开始状态,就让他动起来

          //吃食物
          if(snakeX[0] ==foodx && snakeY[0] ==foody){
              //长度+1
              length++;
              //分数加10;
              score = score +10;
              //再次随机食物
              foodx = 25 +25*random.nextInt(34);
              foodx = 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();
  }
}

 

posted @ 2021-11-04 00:04  Will凸^-^凸  阅读(42)  评论(0编辑  收藏  举报