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 ...
随机推荐
- 读入挂(IO)
快如闪电,清华杜瑜皓的读入挂,一模一样代码,加了这个之后... 细思极恐,and 整整行!!! namespace IO{ #define BUF_SIZE 100000 #define OUT_SI ...
- Windows 系统里面的 hosts 文件
一.什么是hosts文件? hosts文件是一个用于储存计算机网络中各节点信息的计算机文件.这个文件负责将主机名映射到相应的IP地址.hosts文件通常用于补充或取代网络中DNS的功能.和DNS不同的 ...
- OpenCL科普及在ubuntu 16.04 LTS上的安装
OpenCL(Open Computing Language,开放计算语言)是一个为异构平台编写程序的框架,此异构平台可由CPU.GPU.DSP.FPGA或其他类型的处理器與硬體加速器所组成.Open ...
- C# 对密码等数据进行对称性加密解密
类: /// <summary> /// DESEncrypt加密解密算法. /// </summary> public class DESEncrypt { private ...
- HDU 5113--Black And White(搜索+剪枝)
题目链接 Problem Description In mathematics, the four color theorem, or the four color map theorem, stat ...
- xlwt set style making error: More than 4094 XFs (styles)
使用Xlwt,当内容过多时,会报错:More than 4094 XFs (styles) 解决方法: wb = xlwt.Workbook(style_compression=2) 使用style_ ...
- volatile 关键字了解与使用
前言 不管是在面试还是实际开发中 volatile 都是一个应该掌握的技能. 首先来看看为什么会出现这个关键字. 内存可见性 由于 Java 内存模型(JMM)规定,所有的变量都存放在主内存中,而每个 ...
- Nginx 的两种认证方式
简介: 今天来研究一下 Nginx 的两种认证方式. 1.auth_basic 本机认证 2.ngx_http_auth_request_module 第三方认证 一.安装 Nginx shell & ...
- tf.estimator.Estimator类的用法
官网链接:https://www.tensorflow.org/api_docs/python/tf/estimator/Estimator Estimator - 一种可极大地简化机器学习编程的高阶 ...
- C/C++ 中嵌入 arm 汇编
GCC编译器支持直接在C或者C++代码中,嵌入ARM汇编代码.其基本格式非常简单,大致如下: __asm__ [__volatile__] ( assembler template : [output ...