介绍

  1. 包含了很多类和接口

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

  3. java.awt

Frame

就是一个窗口

实现
package com.yeyue.lesson01;

import java.awt.*;

public class TestFrame2 {
   public static void main(String[] args) {

       //展示多个窗口
       MyFrame myFrame = 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);
  }
}
结果展示

面板Panel

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

实现
package com.yeyue.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(159, 159, 186));

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

          }
      });

  }
}
结果展示

布局管理器

流式布局Flow
实现
package com.yeyue.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);
  }
}
结果展示

东西南北中Border
实现
package com.yeyue.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.yeyue.lesson01;

import java.awt.*;

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

       //组件按钮
       Button bth1 = new Button("bth1");
       Button bth2 = new Button("bth2");
       Button bth3 = new Button("bth3");
       Button bth4 = new Button("bth4");
       Button bth5 = new Button("bth5");
       Button bth6 = new Button("bth6");

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

       frame.add(bth1);
       frame.add(bth2);
       frame.add(bth3);
       frame.add(bth4);
       frame.add(bth5);
       frame.add(bth6);

       frame.pack(); //java 函数
       frame.setSize(200,200);

       frame.setVisible(true);
  }
}
结果展示

布局管理器综合练习

先分析过程,然后写代码逐步实现

实现
package com.yeyue.lesson01;

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

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

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

  }
}
结果展示

事件监听

实例
package com.yeyue.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
       MyActionListener myActionListener = new MyActionListener();
       button.addActionListener(myActionListener);

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

       windowsClose(frame);


  }
   public static void windowsClose(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 com.yeyue.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 TestActionEvent2 {
   public static void main(String[] args) {
       //两个按钮,实现同一个监听
       //开始 结束
       Frame frame = new Frame("开始-停止");

       Button button1 = new Button("start");
       Button button2 = new Button("stop");

       //可以显示的定义触发会返回的命令,如果不显示定义,则会走默认值
       //可以多个按钮只写一个监听类
       button1.setActionCommand("button1-start");
       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);

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

class MyMonitor implements ActionListener{
   @Override
   public void actionPerformed(ActionEvent e) {
       //
       System.out.println("按钮被点击了:msg=> " + e.getActionCommand());

  }
}

输入框TextField

package com.yeyue.lesson02;

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

public class TestText {
   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('*');

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

简易计算器,组合+内部类

oop原则:组合大于继承

package com.yeyue.lesson02;

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

//简易计算器
public class TestCacu {
   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 MyCalculatorListener(num1,num2,num3));

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

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

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

       pack();
       setVisible(true);
  }
}

//监听器类
class MyCalculatorListener implements ActionListener {
   //获取三个变量
   private TextField num1,num2,num3;

   public MyCalculatorListener(TextField num1,TextField num2,TextField num3){
       this.num1 = num1;
       this.num2 = num2;
       this.num3 = num3;
  }

   @Override
   public void actionPerformed(ActionEvent e) {
       //1. 获得加数和被加数
       int n1 = Integer.parseInt(num1.getText());
       int n2 = Integer.parseInt(num2.getText());

       //2. 将这个这个值 + 法 运算后,放到第三个框
       num3.setText("" + (n1+n2));

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

  }
}
完全改造为面向对象写法
package com.yeyue.lesson02;

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

//简易计算器
public class TestCacu {
   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);//字符数
       Label label = new Label("+");
       Button button = new Button("=");

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

       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 com.yeyue.lesson02;

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

//简易计算器
public class TestCacu {
   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);//字符数
       Label label = new Label("+");
       Button button = new Button("=");

       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 {
       //获取计算器这个对象,在一个类中组合另一个类
       Calculator calculator = null;

       @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 com.yeyue.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,600,500);
       setVisible(true);
  }

   @Override
   public void paint(Graphics g) {
       //画笔,需要有颜色,可以画画
       g.setColor(Color.red);
       g.drawOval(100,100,100,100);
       g.fillOval(200,200,100,100);  //实心的圆

       g.setColor(Color.GREEN);
       g.drawRect(150,200,200,200);
       g.fillRect(300,10,200,200);

       //养成习惯,画笔用完,将他还原到最初的颜色
  }
}

鼠标监听

目的:实现鼠标画画

package com.yeyue.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 title){
       super(title);
       setBounds(200,200,400,400);

       //存鼠标的点
       points = new ArrayList<>();

       //鼠标监听器,正对这个窗口
       this.addMouseListener(new MyMouseListener());

       setVisible(true);
  }

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

  }

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

   //适配模式
   private class MyMouseListener extends MouseAdapter{
       @Override
       public void mousePressed(MouseEvent e) {
           MyFrame frame = (MyFrame) e.getSource();
           //这个我们点击的时候就会在界面上产生一个点
           //这个点就是鼠标的点
           frame.addPaint(new Point(e.getX(),e.getY())); ;

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

窗口监听

package com.yeyue.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.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");
                  }

              }
      );

  }
}

键盘监听

package com.yeyue.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,400);
       setVisible(true);

       this.addKeyListener(new KeyAdapter(){
           //键盘按下
           @Override
           public void keyPressed(KeyEvent e) {
               //获得键盘下的键是哪个,当前的码
               int keyCode = e.getKeyCode(); //不需要记录这个值,直接使用静态属性
               System.out.println(keyCode);
               if(keyCode == KeyEvent.VK_UP){
                   System.out.println("你按下了上键");
              }
               //根据按下不同操作,产生不同的结果
          }
      });
  }
}

GUI编程之AWT的更多相关文章

  1. java-GUI编程之AWT组件

    AWT中常用组件 基本组件 组件名 功能 Button Button Canvas 用于绘图的画布 Checkbox 复选框组件(也可当做单选框组件使用) CheckboxGroup 用于将多个Che ...

  2. pytho GUI编程之Tkinter

    摘录 python核心编程s GUI(Graphical User Interface)图形用户界面. Tcl.Tk和Tkinter Tkinter是python的默认GUI库.它基于Tk工具包,该工 ...

  3. Python GUI编程之Tkinter

    GUI编程Tkinter Python 提供了多个图形开发界面的库,几个常用 Python GUI 库如下: Tkinter: Tkinter 模块(Tk 接口)是 Python 的标准 Tk GUI ...

  4. Python GUI编程之WxPython

    https://en.wikipedia.org/wiki/WxPython 官网: Overview of wxPython: https://wxpython.org/pages/overview ...

  5. C++混合编程之idlcpp教程Python篇(7)

    上一篇在这 C++混合编程之idlcpp教程Python篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与PythonTutorial4工程相似,工程PythonTutorial5中,同 ...

  6. C++混合编程之idlcpp教程Lua篇(7)

    上一篇在这 C++混合编程之idlcpp教程Lua篇(6) 第一篇在这 C++混合编程之idlcpp教程(一) 与LuaTutorial4工程相似,工程LuaTutorial5中,同样加入了四个文件: ...

  7. QT核心编程之Qt线程 (c)

    QT核心编程之Qt线程是本节要介绍的内容,QT核心编程我们要分几个部分来介绍,想参考更多内容,请看末尾的编辑推荐进行详细阅读,先来看本篇内容. Qt对线程提供了支持,它引入了一些基本与平台无关的线程类 ...

  8. Linux应用编程之lseek详解

    Linux应用编程之lseek详解 1.lseek函数介绍 (1).文件指针:当我们要对一个文件进行读写时,一定要先打开这个文件,所以我们读写的所有文件都是动态文件.动态文件在内存中的形态就是文件流的 ...

  9. 网络编程之socket

    网络编程之socket socket:在网络编程中的一个基本组件,也称套接字. 一个套接字就是socket模块中的socket类的一个实例. 套接字包括两个: 服务器套接字和客户机套接字 套接字的实例 ...

  10. C++混合编程之idlcpp教程Python篇(9)

    上一篇在这 C++混合编程之idlcpp教程Python篇(8) 第一篇在这 C++混合编程之idlcpp教程(一) 与前面的工程相比,工程PythonTutorial7中除了四个文件PythonTu ...

随机推荐

  1. 开源 - Ideal库 - Excel帮助类,ExcelHelper实现(五)

    书接上回,我们继续来聊聊ExcelHelper的具体实现. 01.读取Excel到DataSet单元测试 在上一章我们主要讲解了读取Excel到DataSet的三个重载方法具体实现,还没来得及做单元测 ...

  2. 使用arcpy向server端发布服务

    import arcpy import os # Set output file names outdir = r"D:" service = "MapImageShar ...

  3. 不求甚解--详解ansible-playbook中roles的用法(二)

    前言 本文将详细介绍ansible-playbook中roles的各种用法 环境准备 组件 版本 操作系统 Ubuntu 22.04.4 LTS ansible 2.17.6 基本用法 文件结构 . ...

  4. QEMU CVE-2021-3947 和 CVE-2021-3929 漏洞利用分析

    QEMU CVE-2021-3947 和 CVE-2021-3929 漏洞利用分析 ‍ CVE-2021-3947 信息泄露漏洞 漏洞分析 漏洞点是 nvme_changed_nslist stati ...

  5. IdentityServer4 快速上手

    IdentityServer4 是一个基于 .NET Core 的 OpenID Connect 实现框架. 基于框架创建可运行的应用,通常还需要多个步骤,添加引用.配置项目.框架初始化.按照一系列步 ...

  6. Qt通用方法及类库6

    函数名 //判断是否是IP地址 static bool isIP(const QString &ip); //判断是否是MAC地址 static bool isMac(const QStrin ...

  7. 关于Qt几百个版本无法兼容的深度思考

    关于Qt众多版本(至少几百个)都不兼容的问题,在经过和Qt中国的林斌大神和其他大神(Qt非官方技术交流群)头脑风暴以后,最终得出以下的结论. Qt在二进制兼容这块,已经做了最大的努力,通过将各种代码细 ...

  8. FFmpeg中的色彩空间与像素格式3-像素格式

    FFmpeg 中的色彩与像素系列文章如下: [1]. FFmpeg中的色彩空间与像素格式1-色彩空间基础 [2]. FFmpeg中的色彩空间与像素格式2-RGB/YUV色彩空间 [3]. FFmpeg ...

  9. [转]axios 的理解和使用

    有废话少说,直接附上原文链接: axios 的理解和使用 axios.create(对axios请求进行二次封装) 拦截器 取消请求(axios.CancelToken) 其它链接: 1.axios中 ...

  10. vue3项目中报错:Unexpected mutation of "xxx" prop

    vue3 中element 弹窗绑定需要通过v-model,这个时候父级会传个dialogVisible(boolean值)过来,结果会报eslint的错. Unexpected mutation o ...