Java基础(十二) Java的GUI及AWT包

2024-05-14 08:32
文章标签 java 基础 gui 十二 awt

本文主要是介绍Java基础(十二) Java的GUI及AWT包,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

#Java基础(十二) Java的GUI及AWT包

由于这个模块,使用的不是特变经常,所以只需要达到了解的要求即可。由于Java自带的框架,在使用的过程中不是特别美观,但是基础知识还是需要掌握的。

这类的知识主要有2个作用的方面:1. 制作个人小工具; 2. 用于做C/S架构的东西。但是由于目前的Java主要都是B/S架构的东西,所以,这些工具类很少使用了,但是像收银机等特殊的业务场景还是使用的较为宽泛的。

  • AWT
  • Frame 和 Panel
  • Layout 布局

##1. AWT

图形用户界面(Graphics User Interface, GUI) 是用户与程序交互的窗口,它比基于命令行的界面更直观并且更友好。

GUI的基本类库位于java.awt包中, 这个包也被称为抽象窗口工具箱(Abstract Window Toolkit, AWT)。AWT按照面向对象的思想来创建GUI,它提供了容器类、众多的组件类和布局管理器类。

AWT构建图形用户界面的机制包括:

  • 提供了一些容器组件(如Frame和Panel), 用来容纳其他的组件(如按钮Button、复选框Checkbox和文本框TextField)。
  • 用布局管理器来管理组件在容器上的布局;
  • 利用监听器来响应各种事件,实现用户与程序的交互。一个组件如果注册了某种事件的监听器,由这个组件触发的
    特定事件就会被监听器接收和响应;

##2. 创建GUI 步骤一:选择一个容器

java.awt包中提供了一个抽象类Component,它是所有除了菜单类组件之外的AWT组件的父类。Container类表示容器,继承了Component类。容器用来存放别的组件, 有两种类型的容器:Window和Panel。

###2.1 Window和它的子类Frame
Window是不依赖于其他容器而独立存在的容器。Window有两个子类:Frame和Dialog。Frame带有标题,而且可以调整大小。Dialog可以被移动,但是不能改变大小。

Frame是我们最常用的一种容器。

Frame有一个构造方法——Frame(String title),通过它可以创建一个以参数为标题的Frame对象。Frame的add()方法向容器中加入其他组件。当Frame被创建后,它是不可见的,必须通过以下步骤使Frame成为可见的。

  1. setSize(int width, int height)显示设置Frame的大小,或者调用pack()方法自动确定Frame的大小。pack()方法会确保Frame容器中的组件都会有与布局相适应的合理大小。

  2. setVisible(true)方法使Frame成为可见的。

    import java.awt.*;public class SimpleFrame {public static void main(String[] args) {Frame f = new Frame("hello");f.add(new Button("Press Me"));f.setSize(100,100);f.setVisible(true);}}
  • 注意:如果把f.add(new Button(“Press Me”))语句移到f.setVisible(true)语句之后,再运行程序,将会发现Button没有被显示。这是因为当执行f.setVisible(true)语句时,Frame按照其当时的状态显示界面,接下来添加或删除Frame中的组件,Frame的形状是不会自动更新的,除非再调用f.validate()方法使容器重新布置界面;

###2.2 Panel
Panel不能单独存在,只能存在于其他容器中(Window或其子类)中,它有一个子类Applet,Applet可以在Web浏览器的窗口中运行。一个Panel对象代表了一个长方形的区域,在这区域中可以容纳其他的组件。

可以通过Panel类的默认构造方法来创建一个Panel对象,然后通过Panel的add()方法向Panel中添加组件。如果要使Panel成为可见的,必须通过Frame或Window的add()方法把Panel添加到Frame或Window中。

    import java.awt.*;public class SimplePanel {public static void main(String[] args) {Frame f = new Frame("hello");Panel p = new Panel();p.add(new Button("press me"));p.setBackground(Color.YELLOW);f.add(p);f.setSize(100,100);f.setBackground(Color.BLUE);f.setVisible(true);}}

##3. 创建GUI 步骤二:布局管理器
组件在容器中的位置和尺寸是由布局管理器来决定的。所有的容器都会引用一个布局管理器实例,通过它来自动进行组件的布局管理。

###3.1 默认布局管理器
当一个容器被创建后,它们有相应的默认布局管理器。Window、Frame和Dialog的默认布局管理器是BorderLayout, Panel和Applet的默认布局管理器是FlowLayout。可以通过setLayout()方法来重新设置容器的布局管理器。例:

  Frame f = new Frame("hello");f.setLayout(new FlowLayout());

###3.2 取消布局管理器
如果不希望通过布局管理器来管理布局,可以调用容器的setLayout(null)方法,这样布局管理器就被取消了。

接下来必须调用容器中每个组件的setLocation(), setSize()或setBounds()方法,为这些组件在容器中一一定位。

和布局管理器管理方式不同的是,这种手工布局将导致图形界面的布局不再和平台无关的。相反,图形界面的布局将依赖于操作系统环境。(页面的解析和操作系统息息相关,貌似不是特别推荐)

    import java.awt.*;public class ManualLayout {public static void main(String[] args) {Frame f = new Frame("hello");f.setLayout(null);        //取消布局管理器f.setSize(300,100);                 //宽300, 高100Button b = new Button("press me");b.setSize(100,30);                  //宽100, 高30b.setLocation(40,60);               //x坐标40, y坐标60f.add(b);f.setVisible(true);}}              

###3.3 布局管理器种类
java.awt包提供了5种布局管理器:我们经常使用的是前四种管理器

  • FlowLayout 流式布局管理器;
  • BorderLayout 边界布局管理器;
  • GridLayout网格布局管理器;
  • CardLayout卡片布局管理器;
  • GridBagLayout 网格包布局管理器

javax.swing包提供了一种BoxLayout布局管理器:

##4. 创建GUI 步骤三:在容器中加入组件

##5. 创建GUI 步骤四:创建事件处理器

##6. FlowLayout流式布局管理器

最简单的布局管理器,按照组件的添加次序将它们从左到右地放置在容器中。当到达容器边界时,组件将放置在下一行中。

FlowLayout允许以左对齐、居中对齐(默认方式)或右对齐的方式排列组件。特性:

  • 不限制它所管理的组件的大小, 而是允许它们有自己的最佳大小。
  • 当容器被缩放时,组件的位置可能会变化,但组件的大小不改变。

FlowLayout的构造方法如下:

  • FlowLayout();
  • FlowLayout(int align);
  • FlowLayout(int align, int hgap, int vgap)

参数align用来决定组件在每行中相对于容器的边界的对齐方式,可选值有:

  • FlowLayout.LEFT(左对齐)
  • FlowLayout.RIGHT(右对齐)
  • FlowLayout.CENTER(居中对齐)

参数hgap和参数vgap分别设定组件之间的水平和垂直间隙。

##7. BorderLayout边界布局管理器

将容器分为五个区域:东、南、西、北和中。

###7.1 基本特征

  • 东西区域的组件保持最佳宽度,高度被垂直拉伸至和所有区域一样高;

    南北区域的组件保持最佳高度,宽度被水平拉伸至和所在区域一样宽;

    位于中区域的组件的宽度和高度都被拉伸至和所在区域一样大小。

  • 垂直拉伸,东、西和中区域也拉伸;

    水平拉伸,南、北和中区域也拉伸;

  • 中区域没有组件,也会分配空间显示容器的背景颜色;

    其它区域没有组件,不会分配空间;

  • 容器被缩放,组件所在的相对位置不变化,但组件大小改变;

  • 某个区域添加的组件不止一个,则只有最后添加的一个是可见的;

###7.2 构造方法

  • BorderLayout();

  • BorderLayout(int hgap, int vgap);

    参数hgap和参数vgap分别设定组件之间的水平和垂直间隙;

    对于采用BorderLayout的容器,当它用add()方法添加一个组件时,可以同时为组件指定在容器中的区域。

    void add(Component comp, Object constraints)

    这里的constraints是String类型,可选值为BorderLayout提供的五个常量:

  • BorderLayout.NORTH: 北区域,值为"North";

  • BorderLayout.SOUTH: 南区域,值为"South";

  • BorderLayout.EAST: 东区域,值为"East";

  • BorderLayout.WEST: 西区域,值为"West";

  • BorderLayout.CENTER: 北区域,值为"Center";

Frame的默认布局管理器就是BorderLayout。以下代码把Button放在Frame的北区域。

  Frame f = new Frame("Test");f.add(new Button("b1",BorderLayout.NORTH));//或者:f.add(new Button("b1","North"));

如果不指定add()方法的constraints参数,在默认情况下把组件放在中区域。以下代码向Frame的中区域加入两个Button,但只有最后加入的Button是可见的。

  Frame f = new Frame("Test");f.add(new Button("b1"));f.add(new Button("b2"));f.setSize(100,100);f.setVisible(true);

##8. GridLayout网格布局管理器
GridLayout将容器分割成许多行和列,组件被填充到每个网格中。添加到容器中的组件首先放置在左上角的网格中,然后从左到右放置其他组件,直至占满该行的所有网络,接着继续在下一行中从左到右放置组件。

特性如下:

  • 组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变。组件始终占据网格的整个区域。

  • GridLayout总是忽略组件的最佳大小,所有组件的宽度相同,高度也相同。

  • 将组件用add()方法添加到容器中的先后顺序决定它们占据哪个网络。GridLayout从左到右、从上到下将组件填充到容器的网格中。

    GridLayout的构造方法如下:

  • GridLayout()

  • GridLayout(int rows, int cols)

  • GridLayout(int rows, int cols, int hgap, int vgap)

    参数rows代表行数,参数cols代表列数。参数hgap和vgap规定水平(网络之间的水平距离)和垂直方向(网格之间的垂直距离)的间隙。

##9. CardLayout卡片布局管理器
将界面看做一系列的卡片,在任何时侯只有其中一张卡片是可见的,这张卡片占据容器的整个区域。CardLayout的构造方法:

  • CardLayout()

  • CardLayout(int hgap, int vgap)

    参数hgap表示卡片和容器的左右边界之间的间隙,参数vgap表示卡片和容器的上下边界的间隙。

    对于采用CardLayout的容器,当用add()方法添加一个组件时,需要同时为组件指定所在的卡片的名字。

    void add(Component comp, Object constraints)

    以上constraints参数是一个字符串,表示卡片的名字。在默认情况下,容器显示第一个用add()方法加入到容器。

这篇关于Java基础(十二) Java的GUI及AWT包的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/988266

相关文章

Spring事务传播机制最佳实践

《Spring事务传播机制最佳实践》Spring的事务传播机制为我们提供了优雅的解决方案,本文将带您深入理解这一机制,掌握不同场景下的最佳实践,感兴趣的朋友一起看看吧... 目录1. 什么是事务传播行为2. Spring支持的七种事务传播行为2.1 REQUIRED(默认)2.2 SUPPORTS2

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

Java进程异常故障定位及排查过程

《Java进程异常故障定位及排查过程》:本文主要介绍Java进程异常故障定位及排查过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、故障发现与初步判断1. 监控系统告警2. 日志初步分析二、核心排查工具与步骤1. 进程状态检查2. CPU 飙升问题3. 内存

java中新生代和老生代的关系说明

《java中新生代和老生代的关系说明》:本文主要介绍java中新生代和老生代的关系说明,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、内存区域划分新生代老年代二、对象生命周期与晋升流程三、新生代与老年代的协作机制1. 跨代引用处理2. 动态年龄判定3. 空间分

Java设计模式---迭代器模式(Iterator)解读

《Java设计模式---迭代器模式(Iterator)解读》:本文主要介绍Java设计模式---迭代器模式(Iterator),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,... 目录1、迭代器(Iterator)1.1、结构1.2、常用方法1.3、本质1、解耦集合与遍历逻辑2、统一

Java内存分配与JVM参数详解(推荐)

《Java内存分配与JVM参数详解(推荐)》本文详解JVM内存结构与参数调整,涵盖堆分代、元空间、GC选择及优化策略,帮助开发者提升性能、避免内存泄漏,本文给大家介绍Java内存分配与JVM参数详解,... 目录引言JVM内存结构JVM参数概述堆内存分配年轻代与老年代调整堆内存大小调整年轻代与老年代比例元空

深度解析Java DTO(最新推荐)

《深度解析JavaDTO(最新推荐)》DTO(DataTransferObject)是一种用于在不同层(如Controller层、Service层)之间传输数据的对象设计模式,其核心目的是封装数据,... 目录一、什么是DTO?DTO的核心特点:二、为什么需要DTO?(对比Entity)三、实际应用场景解析

Java 线程安全与 volatile与单例模式问题及解决方案

《Java线程安全与volatile与单例模式问题及解决方案》文章主要讲解线程安全问题的五个成因(调度随机、变量修改、非原子操作、内存可见性、指令重排序)及解决方案,强调使用volatile关键字... 目录什么是线程安全线程安全问题的产生与解决方案线程的调度是随机的多个线程对同一个变量进行修改线程的修改操

从原理到实战深入理解Java 断言assert

《从原理到实战深入理解Java断言assert》本文深入解析Java断言机制,涵盖语法、工作原理、启用方式及与异常的区别,推荐用于开发阶段的条件检查与状态验证,并强调生产环境应使用参数验证工具类替代... 目录深入理解 Java 断言(assert):从原理到实战引言:为什么需要断言?一、断言基础1.1 语

深度解析Java项目中包和包之间的联系

《深度解析Java项目中包和包之间的联系》文章浏览阅读850次,点赞13次,收藏8次。本文详细介绍了Java分层架构中的几个关键包:DTO、Controller、Service和Mapper。_jav... 目录前言一、各大包1.DTO1.1、DTO的核心用途1.2. DTO与实体类(Entity)的区别1