1. 初识 AWT

      GUI 和 AWT

GUI:Graphics User Interface  图形用户界面

AWT:Abstract Window Toolkit  抽象窗口工具集

之前的程序输出结果均在控制台上显示,现在学习AWT后,可以编程显示图形用户界面。

抽象窗口工具包AWT (Abstract Window Toolkit) 是 API为Java 程序提供的建立图形用户界面GUI (Graphics User Interface)工具集,之所以叫抽象窗口工具集,是因为该图形用户界面可以与系统无关,可以跨平台AWT可用于Java的applet和applications中,它支持图形用户界面编程。

  • 功能包括:

用户界面组件;

事件处理模型;

图形和图像工具,包括形状、颜色和字体类;

布局管理器,可以进行灵活的窗口布局而与特定窗口的尺寸和屏幕分辨率无关;

数据传送类,可以通过本地平台的剪贴板来进行剪切和粘贴。

  • java.awt包

java.awt包中提供了GUI设计所使用的类和接口。
java.awt包提供了基本的java程序的GUI设计工具。主要包括下述三个概念:

组件--Component
容器--Container
布局管理器--LayoutManager

  • 组件、容器和布局管理器

 组件    

Java的图形用户界面的最基本组成部分是组件(Component),组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,例如一个按钮,一个标签等。组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。

常用组件:

Button 按钮:

label 标签 :显示文字内容

TextField 文本框 :接受用户输入

这些组件都被封装成类,编程时进行实例化被直接调用。

  类java.awt.Component是许多组件类的父类,Component类中封装了组件通用的方法和属性,如图形的组件对象、大小、显示位置、前景色和背景色、边界、可见性等,因此许多组件类也就继承了Component类的成员方法和成员变量,相应的成员方法包括:

getComponentAt(int x, int y)
   getFont()
   getForeground()
   getName()
   getSize()
   paint(Graphics g)
   repaint()
   update()
   setVisible(boolean b)
   setSize(Dimension d)
   setName(String name)等

容器

容器(Container)也是一个类,实际上是Component的子类,因此容器本身也是一个组件,具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。

常用容器

  容器java.awt.Container是Component的子类,一个容器可以容纳多个组件,并使它们成为一个整体。容器可以简化图形化界面的设计,以整体结构来布置界面。所有的容器都可以通过add()方法向容器中添加组件。

  有三种类型的容器:Window、Panel、ScrollPane,常用的有Panel, Frame, Applet。

 1.Frame 窗口
     继承关系

  

  • 程序实现
  1. public class Demo01 {
  2.  
  3. public static void main(String[] args) {
  4. Frame frame = new Frame("我的第一个窗口");
  5. frame.setBounds(50, 50, 300, 200);//设置Frame 的大小,距离windows界面上左均为50,宽和高分别为300 200
  6. frame.setBackground(Color.PINK);
  7. frame.setVisible(true);//设置Frame为可见
  8.  
  9. }
  10.  
  11. }

Output:

一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( )来设置大小,调用setVisible(true)来设置该窗口为可见的。

  另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。

2. Panel 面板

  

  • 程序实现
  1. public class Demo02 {
  2.  
  3. public static void main(String[] args) {
  4. Frame frame = new Frame("我的panel 界面");
  5. frame.setBounds(50, 50, 500, 300);
  6. Panel panel = new Panel();
  7. panel.setBackground(Color.pink);
  8. //panel.setBounds(0, 0, 200, 100); 如果要用 panel将整个窗口分块,则要用到布局管理器,不可直接调用实现
  9.  
  10. frame.add(panel);
  11. frame.setVisible(true);
  12.  
  13. }
  14.  
  15. }

Output:

Panel 可以作为容器容纳其他组件,但不可以像Frame 一样独立存在,必须将其添加到其他容器其中。

  • 简单的用户登陆界面的代码实现
  1. public class Demo03 {
  2.  
  3. public static void main(String[] args) {
  4. Frame frame = new Frame("用户登入窗口");
  5. frame.setBounds(50, 50, 400, 100);
  6.  
  7. Panel panel = new Panel();
  8. panel.setBackground(Color.pink);
  9. frame.add(panel);
  10.  
  11. Label lable = new Label("用户名");
  12. TextField textField = new TextField("请输入用户名",20);//20为文本框长度
  13. Button loginbtn = new Button("确定");
  14.  
  15. panel.add(lable);
  16. panel.add(textField);
  17. panel.add(loginbtn);
  18.  
  19. frame.setVisible(true);
  20. }
  21.  
  22. }

Output:

需要注意的是,Lebel 、TextField、 Button这些组件的添加是有顺序的,以上是一个简单的界面,比较复杂的情况则要使用布局管理器来实现。 并且以上的代码比较简单,实现的只是最基本的显示功能,并不能进行实际的登陆与关闭操作。

  布局管理器(LayoutManager):每个容器都有一个布局管理器,当容器需要对某个组件进行定位或判断其大小尺寸时,就会调用其对应的布局管理器。

为了使我们生成的图形用户界面具有良好的平台无关性,Java语言中,提供了布局管理器这个工具来管理组件在容器中的布局,而不使用直接设置组件位置和大小的方式。

布局管理器主要包括:FlowLayout,BorderLayout,GridLayout,CardLayout,GridBagLayout

1. FlowLayout(流布局)

  FlowLayout 是Panel,Applet的缺省布局管理器(默认布局管理器)。其组件的放置规律是从上到下、从左到右进行放置,如果容器足够宽,第一个组件先添加到容器中第一行的最左边,后续的组件依次添加到上一个组件的右边,如果当前行已放置不下该组件,则放置到下一行的最左边。

FlowLayout(FlowLayout.RIGHT,20,40);
  /*第一个参数表示组件的对齐方式,指组件在这一行中的位置是居中对齐、居右对齐还是居左对齐,第二个参数是组件之间的横向间隔,第三个参数是组件之间的纵向间隔,单位是象素。*/
  FlowLayout(FlowLayout.LEFT);
  //居左对齐,横向间隔和纵向间隔都是缺省值5个象素
  FlowLayout();
  //缺省的对齐方式居中对齐,横向间隔和纵向间隔都是缺省值5个象素

  • 代码实现
  1. public static void main(String[] args) {
  2. Frame frame = new Frame("FlowLayout");
  3. frame.setBounds(100, 100, 400, 300);
  4. frame.setLayout(new FlowLayout());
  5.  
  6. Button but1 = new Button("button1");
  7. Button but2 = new Button("button2");
  8. Button but3 = new Button("button3");
  9. Button but4 = new Button("button4");
  10. Button but5 = new Button("button5");
  11.  
  12. but1.setBackground(Color.blue);
  13. but2.setBackground(Color.yellow);
  14. but3.setBackground(Color.red);
  15. but4.setBackground(Color.green);
  16. but5.setBackground(Color.pink);
  17.  
  18. frame.add(but1);
  19. frame.add(but2);
  20. frame.add(but3);
  21. frame.add(but4);
  22. frame.add(but5);
  23.  
  24. frame.setVisible(true);
  25.  
  26. }
  27.  
  28. }

Output:

流布局与麻将布局的不同在于麻将布局要自己设置东西南北中的位置布局,而流布局则是按照按钮的调用先后顺序依次排列。默认居中排列,如果要设置为居左或居右排列,只需实例化FlowLayout ,用其实例对象 fl 调用设置队列的方法,将其设置为居左。

即FlowLayout fl = new FlowLayout();
   fl.setAlignment(FlowLayout.LEFT);
   frame.setLayout(fl);

上图为居左放置。

2. BorderLayout(麻将布局)

  BorderLayout 是Window,Frame和Dialog的缺省(默认)布局管理器。BorderLayout布局管理器把容器分成5个区域:North,South,East,West和Center,每个区域只能放置一个组件。各个区域的位置及大小如下图所示:

    

  • 代码实现
  1. public class Demo04 {
  2.  
  3. public static void main(String[] args) {
  4. Frame frame = new Frame("BorderLayt");
  5. frame.setBounds(100, 100, 400, 300);
  6. //设置 frame 的布局为BorderLayout
  7. frame.setLayout(new BorderLayout());
  8.  
  9. Button btn1 = new Button("button1");
  10. Button btn2 = new Button("button2");
  11. Button btn3 = new Button("button3");
  12. Button btn4 = new Button("button4");
  13. Button btn5 = new Button("button5");
  14.  
  15. btn1.setBackground(Color.blue);
  16. btn2.setBackground(Color.yellow);
  17. btn3.setBackground(Color.pink);
  18. btn4.setBackground(Color.green);
  19. btn5.setBackground(Color.red);
  20.  
  21. frame.add(btn1,BorderLayout.EAST);
  22. frame.add(btn2,BorderLayout.NORTH);
  23. frame.add(btn3,BorderLayout.SOUTH);
  24. frame.add(btn4,BorderLayout.WEST);
  25. frame.add(btn5);
  26.  
  27. frame.setVisible(true);
  28. }
  29.  
  30. }

Output:

3. GridLayout(表格布局)

  使容器中各个组件呈网格状布局,平均占据容器的空间。

  在程序中安排组件的位置和大小时,应该注意以下两点:

  • 容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java 语言提供的setLocation(),setSize(),setBounds() 等方法,则都会被布局管理器覆盖。
  • 如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null);
  • 代码实现
  1. public class Demo06 {
  2.  
  3. public static void main(String[] args) {
  4. Frame frame = new Frame("FlowLayout");
  5. frame.setBounds(100, 100, 400, 300);
  6.  
  7. GridLayout gl = new GridLayout(3,2,5,5); //设置表格为3行两列排列,表格横向间距为5个像素,纵向间距为5个像素
  8. frame.setLayout(gl);
  9.  
  10. Button but1 = new Button("button1");
  11. Button but2 = new Button("button2");
  12. Button but3 = new Button("button3");
  13. Button but4 = new Button("button4");
  14. Button but5 = new Button("button5");
  15.  
  16. but1.setBackground(Color.blue);
  17. but2.setBackground(Color.yellow);
  18. but3.setBackground(Color.red);
  19. but4.setBackground(Color.green);
  20. but5.setBackground(Color.pink);
  21.  
  22. frame.add(but1);
  23. frame.add(but2);
  24. frame.add(but3);
  25. frame.add(but4);
  26. frame.add(but5);
  27.  
  28. frame.setVisible(true);
  29.  
  30. }
  31.  
  32. }

Output:

  • 综合运用—— 实现一个简单的4*4 计算器界面
  1. public class Demo07 {
  2.  
  3. public static void main(String[] args) {
  4. Frame frame = new Frame("计算器");
  5. frame.setBounds(100, 100, 300, 420);
  6. /*因为Frame 的默认布局为BorderLayout 所以这两句代码可以省略。
  7. BorderLayout bl = new BorderLayout();
  8. frame.setLayout(bl);
  9. */
  10.  
  11. //创建一个文本输入框,然后将其添加到 North 位置
  12. TextField tf = new TextField();
  13. frame.add(tf, BorderLayout.NORTH);
  14.  
  15. //创建一个Panel 面板,并设置布局为 GridLayout
  16. Panel panel = new Panel();
  17. GridLayout gl = new GridLayout(4,4,1,1);//创建Panel 面板,大小为4*4,行距与列距均为1 个像素点
  18. panel.setLayout(gl);
  19.  
  20. //将 panel 添加到 frame 的 Center 位置
  21. frame.add(panel, BorderLayout.CENTER);
  22. Button btn1 = new Button (" 7");
  23. Button btn2 = new Button (" 8");
  24. Button btn3 = new Button (" 9");
  25. Button btn4 = new Button (" +");
  26. Button btn5 = new Button (" 4");
  27. Button btn6 = new Button (" 5");
  28. Button btn7 = new Button (" 6");
  29. Button btn8 = new Button (" -");
  30. Button btn9 = new Button (" 1");
  31. Button btn10 = new Button ("2");
  32. Button btn11 = new Button ("3 ");
  33. Button btn12 = new Button ("*");
  34. Button btn13 = new Button ("0 ");
  35. Button btn14 = new Button (" .");
  36. Button btn15 = new Button (" =");
  37. Button btn16 = new Button (" /");
  38.  
  39. //将按钮添加到 Panel 面板
  40. panel.add(btn1);
  41. panel.add(btn2);
  42. panel.add(btn3);
  43. panel.add(btn4);
  44. panel.add(btn5);
  45. panel.add(btn6);
  46. panel.add(btn7);
  47. panel.add(btn8);
  48. panel.add(btn9);
  49. panel.add(btn10);
  50. panel.add(btn11);
  51. panel.add(btn12);
  52. panel.add(btn13);
  53. panel.add(btn14);
  54. panel.add(btn15);
  55. panel.add(btn16);
  56.  
  57. frame.setVisible( true);
  58.  
  59. }
  60.  
  61. }

Output:

  • 总结

   1.Frame是一个顶级窗口。Frame的缺省布局管理器为BorderLayout。

   2.Panel 无法单独显示,必须添加到某个容器中。 Panel 的缺省布局管理器为FlowLayout。

   3.当把Panel 作为一个组件添加到某个容器中后,该Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。

   4.如果采用无布局管理器 setLayout(null),则必须使用setLocation(),setSize(),setBounds()等方法手工设置组件的大小和位置,此方法会导致平台相关,不鼓励使用。

AWT初步—Frame和 Panel的更多相关文章

  1. GUI初步和frame&panel

    java的话这个GUI其实不是什么重点,但我们也要学习,重点是学习这种图形编程的思路. java里面对于图形的一些类都封装在了AWT和它的一些子包里.AWT(抽象窗口开发包)            当 ...

  2. AWT初步— 事件处理模型

    之前学习的内容只能形成一个用户界面,而用户不能对其有实际的操作,也就是说用户界面没有任何功能.要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制.在事件处理的过程中,主要涉及三类对象: ...

  3. 第34天学习打卡(GUI编程之组件和容器 frame panel 布局管理 事件监听 多个按钮共享一个事件 )

    GUI编程 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1 简介 GUi的核心技术:Swing AWT 1.界面不美观 2.需要jre环境 为什么要学习GU ...

  4. AWT编程学习01(未完成)

    本文资料来源:<java疯狂讲义> 作者:李刚 终于要学习这一部分了~~虽然很多人(明明是绝大多数的人)说学这个没有用...而且有点过时了...但我觉得很有意思啊...感兴趣就学~~反正多 ...

  5. AWT事件处理

    AWT事件处理基本概念 AWT事件处理过程中,主要涉及3类对象: ①   Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent.其实例 ...

  6. AWT布局管理器

    布局管理器 容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的.在AWT中为我们提供了以下5种布局管理器: ①   FlowLayout 流式布局管理器 ②   BorderLa ...

  7. Java可视化AWT

    AWT 总体上Swing组件替代了绝大部分AWT组件,对AWT图形用户界面编程有极好的补充和加强. package ch11; import java.awt.*; /** * Created by ...

  8. Java学习笔记--AWT事件处理

    1.事件模型 在整个事件触发和相应的过程中,主要涉及一下3类对象 (1) 事件源 : 引起时间的GUI对象,如各类组件(Button,Label,TextField),容器组件(Frame,panel ...

  9. Java之Frame

    Java之Frame 1.测试Java中的Frame 具体实现如下: /** * @Title:FrameJava.java * @Package:com.you.model * @Descripti ...

随机推荐

  1. 使用new Image()进行预加载

    概述 这篇博文记录了用new Image()进行预加载的总结,供以后开发时参考,相信对其他人也有用. 旧的预加载 一般我们为了让背景图更快的加载,我们常常把背景图放在一个display:none的im ...

  2. Swift5 语言指南(十) 枚举

    一个枚举定义了一个通用型的一组相关的值,使你在你的代码中的一个类型安全的方式这些值来工作. 如果您熟悉C,您将知道C枚举将相关名称分配给一组整数值.Swift中的枚举更灵活,并且不必为枚举的每个案例提 ...

  3. Shell-4--环境变量

  4. C语言判断大小端的几种方法

    在操作系统中,经常会用到判断大小端,很多面试题中也会经常遇到,以前的时候没有总结过,这里总结一下. 以后用到了就直接可以用了. 所谓的大小端,大致的解释意思就是: [大端模式] CPU对操作数的存放方 ...

  5. 关于@font-face的使用

    以前在写网页的时候,总是使用浏览器默认的字体,因此从未使用过@font-face,然而,最近在做官网的时候,UI规定了字体,要在所有浏览器下都展现同一效果.多番查询下,发现@font-face用起来是 ...

  6. python(31)——【sys模块】【json模块 & pickle模块】

    一.sys模块 import sys sys.argv #命令行参数List,第一个元素是程序本身路径 sys.exit() #退出程序,正常退出时exit(0) sys.version #获取pyt ...

  7. [EXP]CVE-2018-2628 Weblogic GetShell Exploit

    漏洞简介 漏洞威胁:RCE--远程代码执行 漏洞组件:weblogic 影响版本:10.3.6.0.12.1.3.0.12.2.1.2.12.2.1.3 代码: # -*- coding: utf-8 ...

  8. Eclipse创建web项目目录结构

    效果图如下: 0 新建Web项目 1.右击项目MyProject进入Java Build Path 2. 点击Add Folder按钮,进入如下界面 3.选择src,点击Add New Folder按 ...

  9. dart之旅(一)

    前言 最近在看 dart 了,本着 "纸上得来终觉浅,绝知此事 markdown" 的原则,准备边学边写,写一个系列,这是第一篇.学习过程中主要是参考 A Tour of the ...

  10. 团队作业4——beta阶段冲刺

    Deadline: 2018-12-16 22:00PM,以博客提交至班级博客时间为准 提交: (a) 项目课堂演示: (b) 1篇冲刺准备+5篇冲刺随笔,: (c) 1篇用户使用用报告: (d) 1 ...