AWT初步—Frame和 Panel
- 初识 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 窗口
继承关系

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

一般我们要生成一个窗口,通常是用Window的子类Frame来进行实例化,而不是直接用到Window类。Frame的外观就像我们平常在windows系统下见到的窗口,有标题、边框、菜单、大小等等。每个Frame的对象实例化以后,都是没有大小和不可见的,因此必须调用setSize( )来设置大小,调用setVisible(true)来设置该窗口为可见的。
另外,AWT在实际的运行过程中是调用所在平台的图形系统,因此同样一段AWT程序在不同的操作系统平台下运行所看到的图形系统是不一样的。例如在windows下运行,则显示的窗口是windows风格的窗口;而在UNIX下运行时,则显示的是UNIX风格的窗口。
2. Panel 面板

- 程序实现
public class Demo02 {
public static void main(String[] args) {
Frame frame = new Frame("我的panel 界面");
frame.setBounds(50, 50, 500, 300);
Panel panel = new Panel();
panel.setBackground(Color.pink);
//panel.setBounds(0, 0, 200, 100); 如果要用 panel将整个窗口分块,则要用到布局管理器,不可直接调用实现
frame.add(panel);
frame.setVisible(true);
}
}
Output:

Panel 可以作为容器容纳其他组件,但不可以像Frame 一样独立存在,必须将其添加到其他容器其中。
- 简单的用户登陆界面的代码实现
public class Demo03 {
public static void main(String[] args) {
Frame frame = new Frame("用户登入窗口");
frame.setBounds(50, 50, 400, 100);
Panel panel = new Panel();
panel.setBackground(Color.pink);
frame.add(panel);
Label lable = new Label("用户名");
TextField textField = new TextField("请输入用户名",20);//20为文本框长度
Button loginbtn = new Button("确定");
panel.add(lable);
panel.add(textField);
panel.add(loginbtn);
frame.setVisible(true);
}
}
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个象素
- 代码实现
public static void main(String[] args) {
Frame frame = new Frame("FlowLayout");
frame.setBounds(100, 100, 400, 300);
frame.setLayout(new FlowLayout());
Button but1 = new Button("button1");
Button but2 = new Button("button2");
Button but3 = new Button("button3");
Button but4 = new Button("button4");
Button but5 = new Button("button5");
but1.setBackground(Color.blue);
but2.setBackground(Color.yellow);
but3.setBackground(Color.red);
but4.setBackground(Color.green);
but5.setBackground(Color.pink);
frame.add(but1);
frame.add(but2);
frame.add(but3);
frame.add(but4);
frame.add(but5);
frame.setVisible(true);
}
}
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,每个区域只能放置一个组件。各个区域的位置及大小如下图所示:

- 代码实现
public class Demo04 {
public static void main(String[] args) {
Frame frame = new Frame("BorderLayt");
frame.setBounds(100, 100, 400, 300);
//设置 frame 的布局为BorderLayout
frame.setLayout(new BorderLayout());
Button btn1 = new Button("button1");
Button btn2 = new Button("button2");
Button btn3 = new Button("button3");
Button btn4 = new Button("button4");
Button btn5 = new Button("button5");
btn1.setBackground(Color.blue);
btn2.setBackground(Color.yellow);
btn3.setBackground(Color.pink);
btn4.setBackground(Color.green);
btn5.setBackground(Color.red);
frame.add(btn1,BorderLayout.EAST);
frame.add(btn2,BorderLayout.NORTH);
frame.add(btn3,BorderLayout.SOUTH);
frame.add(btn4,BorderLayout.WEST);
frame.add(btn5);
frame.setVisible(true);
}
}
Output:

3. GridLayout(表格布局)
使容器中各个组件呈网格状布局,平均占据容器的空间。
在程序中安排组件的位置和大小时,应该注意以下两点:
- 容器中的布局管理器负责各个组件的大小和位置,因此用户无法在这种情况下设置组件的这些属性。如果试图使用Java 语言提供的setLocation(),setSize(),setBounds() 等方法,则都会被布局管理器覆盖。
- 如果用户确实需要亲自设置组件大小或位置,则应取消该容器的布局管理器,方法为:setLayout(null);
- 代码实现
public class Demo06 {
public static void main(String[] args) {
Frame frame = new Frame("FlowLayout");
frame.setBounds(100, 100, 400, 300);
GridLayout gl = new GridLayout(3,2,5,5); //设置表格为3行两列排列,表格横向间距为5个像素,纵向间距为5个像素
frame.setLayout(gl);
Button but1 = new Button("button1");
Button but2 = new Button("button2");
Button but3 = new Button("button3");
Button but4 = new Button("button4");
Button but5 = new Button("button5");
but1.setBackground(Color.blue);
but2.setBackground(Color.yellow);
but3.setBackground(Color.red);
but4.setBackground(Color.green);
but5.setBackground(Color.pink);
frame.add(but1);
frame.add(but2);
frame.add(but3);
frame.add(but4);
frame.add(but5);
frame.setVisible(true);
}
}
Output:

- 综合运用—— 实现一个简单的4*4 计算器界面
public class Demo07 {
public static void main(String[] args) {
Frame frame = new Frame("计算器");
frame.setBounds(100, 100, 300, 420);
/*因为Frame 的默认布局为BorderLayout 所以这两句代码可以省略。
BorderLayout bl = new BorderLayout();
frame.setLayout(bl);
*/
//创建一个文本输入框,然后将其添加到 North 位置
TextField tf = new TextField();
frame.add(tf, BorderLayout.NORTH);
//创建一个Panel 面板,并设置布局为 GridLayout
Panel panel = new Panel();
GridLayout gl = new GridLayout(4,4,1,1);//创建Panel 面板,大小为4*4,行距与列距均为1 个像素点
panel.setLayout(gl);
//将 panel 添加到 frame 的 Center 位置
frame.add(panel, BorderLayout.CENTER);
Button btn1 = new Button (" 7");
Button btn2 = new Button (" 8");
Button btn3 = new Button (" 9");
Button btn4 = new Button (" +");
Button btn5 = new Button (" 4");
Button btn6 = new Button (" 5");
Button btn7 = new Button (" 6");
Button btn8 = new Button (" -");
Button btn9 = new Button (" 1");
Button btn10 = new Button ("2");
Button btn11 = new Button ("3 ");
Button btn12 = new Button ("*");
Button btn13 = new Button ("0 ");
Button btn14 = new Button (" .");
Button btn15 = new Button (" =");
Button btn16 = new Button (" /");
//将按钮添加到 Panel 面板
panel.add(btn1);
panel.add(btn2);
panel.add(btn3);
panel.add(btn4);
panel.add(btn5);
panel.add(btn6);
panel.add(btn7);
panel.add(btn8);
panel.add(btn9);
panel.add(btn10);
panel.add(btn11);
panel.add(btn12);
panel.add(btn13);
panel.add(btn14);
panel.add(btn15);
panel.add(btn16);
frame.setVisible( true);
}
}
Output:

- 总结
1.Frame是一个顶级窗口。Frame的缺省布局管理器为BorderLayout。
2.Panel 无法单独显示,必须添加到某个容器中。 Panel 的缺省布局管理器为FlowLayout。
3.当把Panel 作为一个组件添加到某个容器中后,该Panel 仍然可以有自己的布局管理器。因此,可以利用Panel 使得BorderLayout 中某个区域显示多个组件,达到设计复杂用户界面的目的 。
4.如果采用无布局管理器 setLayout(null),则必须使用setLocation(),setSize(),setBounds()等方法手工设置组件的大小和位置,此方法会导致平台相关,不鼓励使用。
AWT初步—Frame和 Panel的更多相关文章
- GUI初步和frame&panel
java的话这个GUI其实不是什么重点,但我们也要学习,重点是学习这种图形编程的思路. java里面对于图形的一些类都封装在了AWT和它的一些子包里.AWT(抽象窗口开发包) 当 ...
- AWT初步— 事件处理模型
之前学习的内容只能形成一个用户界面,而用户不能对其有实际的操作,也就是说用户界面没有任何功能.要能够让图形界面接收用户的操作,就必须给各个组件加上事件处理机制.在事件处理的过程中,主要涉及三类对象: ...
- 第34天学习打卡(GUI编程之组件和容器 frame panel 布局管理 事件监听 多个按钮共享一个事件 )
GUI编程 组件 窗口 弹窗 面板 文本框 列表框 按钮 图片 监听事件 鼠标 键盘事件 破解工具 1 简介 GUi的核心技术:Swing AWT 1.界面不美观 2.需要jre环境 为什么要学习GU ...
- AWT编程学习01(未完成)
本文资料来源:<java疯狂讲义> 作者:李刚 终于要学习这一部分了~~虽然很多人(明明是绝大多数的人)说学这个没有用...而且有点过时了...但我觉得很有意思啊...感兴趣就学~~反正多 ...
- AWT事件处理
AWT事件处理基本概念 AWT事件处理过程中,主要涉及3类对象: ① Event(事件):用户对组件的一个操作,称之为一个事件,以类的形式出现,例如,键盘操作对应的事件类是KeyEvent.其实例 ...
- AWT布局管理器
布局管理器 容器内可以存放各种组件,而组件的位置和大小是由容器内的布局管理器来决定的.在AWT中为我们提供了以下5种布局管理器: ① FlowLayout 流式布局管理器 ② BorderLa ...
- Java可视化AWT
AWT 总体上Swing组件替代了绝大部分AWT组件,对AWT图形用户界面编程有极好的补充和加强. package ch11; import java.awt.*; /** * Created by ...
- Java学习笔记--AWT事件处理
1.事件模型 在整个事件触发和相应的过程中,主要涉及一下3类对象 (1) 事件源 : 引起时间的GUI对象,如各类组件(Button,Label,TextField),容器组件(Frame,panel ...
- Java之Frame
Java之Frame 1.测试Java中的Frame 具体实现如下: /** * @Title:FrameJava.java * @Package:com.you.model * @Descripti ...
随机推荐
- Cordova - 安装camera插件之后编译错误解决方法!
安装camera插件之后,编译出错,错误截图如下: 刚开始以为是AAPT编译导致的,尝试关闭AAPT编译选项,但是不行,认真看了一下编译出错信息,应该是缺少文件导致的,随后在对应的目录中加入了缺失的文 ...
- 第31节:Java基础-类与对象
前言 Java基础-类与对象,方法的重载,构造方法的重载,static关键字,main()方法,this关键字,包,访问权限,类的继承,继承性,方法的重写,super变量. 方法的重载:成员方法的重载 ...
- Vue-Cli 搭建项目 小白
vue-用Vue-cli从零开始搭建一个Vue项目 Vue是近两年来比较火的一个前端框架(渐进式框架吧). Vue两大核心思想:组件化和数据驱动.组件化就是将一个整体合理拆分为一个一个小块(组件),组 ...
- ubuntu root默认密码(初始密码)
ubuntu安装好后,root初始密码(默认密码)不知道,需要设置. 1.先用安装时候的用户登录进入系统 2.输入:sudo passwd 按回车 3.输入新密码,重复输入密码,最后提示passwd ...
- Tools - OpenSSL
OpenSSL http://www.openssl.org/ OpenSSL is an open source project that provides a robust, commercial ...
- redis pipeline 独占链接
pipeline期间将“独占”链接,此期间将不能进行非“管道”类型的其他操作,直到pipeline关闭:如果你的pipeline的指令集很庞大,为了不干扰链接中的其他操作,你可以为pipeline操作 ...
- django xlwt实现资产导出功能
做个记录 views import xlwt class ExAssetView(LoginRequiredMixin,View): def get(self,request): row = 1 st ...
- 安装Elasticsearch中Head插件并使用
基础环境 Elasticsearch集群搭建请参考前一篇文章http://www.cnblogs.com/aubin/p/8012840.html 系统 节点名 IP 软件版本 CentOS7.3 e ...
- Django--模板层template
一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...
- 关于dao层的封装和前端分页的结合(文章有点长,耐心点哦)
任何一个封装讲究的是,实用,多状态.Action: 任何一个Action继承分页有关参数类PageManage,自然考虑的到分页效果,我们必须定义下几个分页的参数.并根据这个参数进行查值. 然 ...