概述
GUI, Graphical User Interface, 图形用户界面
AWT, Abstract Window Toolkit, 抽象窗口工具集
相关软件包:
java.awt
包:提供基本GUI组件、视觉控制和绘图工具APIjava.awt.event
包:提供Java GUI时间处理API
Java.awt包GUI组件类:Menu/Button/Label/TextField等
Component类:除菜单相关组件之外所有Java AWT组件类的根父类
容器(Container):Component的子类,包括两种主要的容器类型:
- java.awt.Window
- java.awt.Panel
Windows类:Container的子类
- Windows类:
setSize(int width, int height)
方法 vs. pack()方法
setSize
:给定具体的窗口宽和高pack
:窗体组件紧凑化,即调整窗口以适合其子组件的首选大小和布局
- Windows类:
组件定位:Java组件在容器中的定位由布局管理器决定
- 几个组件定位方法:
- setLocation():位置
- setSize():大小
- setBounds():位置和大小
- GUI坐标系:左上角(0, 0)
- 几个组件定位方法:
Frame
- 继承:Object<–Component<–Container<–Window<–Frame
- 显示效果是一个可自由停泊的顶级“窗口”
- 默认不可见,调用
setVisible(true)
使可见 - 调用
add()
方法包含其他组件
Panel
- 继承:Object<–Component<–Container<–Panel
- 容纳组件的空间
- 不能独立存在,必须添加到其他容器中
- 可采用和所在容器不同的布局管理器
布局管理器
布局(Layout)
- 容器对组件的排列方式,包括组件的位置和大小设定
布局管理器
- 为了使GUI具有良好的平台无关性,java提供布局管理器管理容器的布局,而不建议直接设置组件在容器中的位置和尺寸
LayoutManager FlowLayout GridLayout LayoutManager2 BorderLayout CardLayout GridBagLayout 每个容器都有一个布局管理器,当容器需要对某个组件进行定位或尺寸判断时,就会调用对应的布局管理器。
- Window容器类:包括子类Frame和Dialog,默认使用BorderLayout布局
- Panel容器类:包括子类Applet,默认使用FlowLayout布局
FlowLayout布局
- 组件按加入次序逐行定位,从左到右,排满后换行;
- 组件按原始大小显示
- 组件默认居中对齐,构造方法可设置间距、行距和对齐方式
FlowLayout()
FlowLayout(int align)
FlowLayout(int align, int hgap, int vgap)
BorderLayout布局
- 将整个容器分为东、西、南、北、中5个区域,组件只能被添加到指定区域;默认加入到Center区域
- 每个区域只能加一个组件,新加入的组件会替换之前加入的组件
- 组件尺寸被强行控制,即与所在区域尺寸相同
- North、South:宽度可调
- East、West:高度可调
- Center:宽度、高度均可调
BorderLayout()
BorderLayout(int hgap, int vgap)
GridLayout布局(网格布局)
- 容器区域划分为规则的矩形网格;按组件加入顺序,从左到右,从上到下填充组件
- 当容器尺寸变化时,网格大小自动调整
GridLayout(int rows, int cols)
GridLayout(int rows, int cols, int hgap, int vgap)
CardLayout布局(卡片布局)
- 多个组件在同一容器区域内交替显示,只有最上面卡片可见
- 可按名称显示某一卡片,或按先后顺序依次显示,也可以直接定位到第一章或最后一张卡片
void first(Container parent)
void last(Container parent)
void previous(Container parent)
void next(Container parent)
// 按名称显示某一张卡片
void show(Container parent, String name)
GridBagLayout布局(网格包布局)
- 建立在GridLayout基础上,更复杂而灵活
通过设置一个或多个实例变量来自定义GridBagConstraints对象,来有效使用网格包布局
- 常用的变量:
- GridBagConstraints.fill:一般用GridBagConstraints.BOTH(使组件完全填满其显示区域)
- GridBagConstraints.gridwidth、GridBagConstraints.gridheight:占用的宽和高
- GridBagConstraints.weightx、GridBagConstraints.weighty:拉伸权重,一般0和1
- 两个重要常量:
- GridBagConstraints.RELATIVE:倒数第二,后边使用REMAINDER
- GridBagConstraints.REMAINDER:倒数第一,下一个换行
参考:
- 深入学习GridBagLayout
- Java 最重要布局管理器GridBagLayout的使用方法
- 常用的变量:
容器的嵌套使用
- Frame下添加Panel等组件,Panel填充其他组件
Frame frame = new Frame("计算器");
Panel panel = new Panel();
panel.setLayout(new GridLayout(2, 2));
Button screen = new Button("数显屏幕");
Button btn1 = new Button("1");
Button btn2 = new Button("2");
Button btn3 = new Button("3");
Button btn4 = new Button("4");
frame.add(screen, BorderLayout.NORTH);
frame.add(panel, BorderLayout.CENTER);
panel.add(btn1);
panel.add(btn2);
panel.add(btn3);
panel.add(btn4);
frame.pack();
frame.setVisible(true);
GUI事件处理
- 定义多种事件类型对象(Event)
- 事件源(Event Source)组件注册事件,触发事件
- Java运行时环境时间监听器(Event Listener)接收到事件,转发给事件处理对象,调用事件处理方法(Event Handler)
举例:
事件注册:调用addActionListener(ActionListener actionlistener)方法
事件监听器:实现ActionListener接口,处理ActionEvent事件
public class TestActionEvent {
public static void main(String[] args) {
Frame frame = new Frame();
Button b = new Button("按钮");
frame.add(b);
// 创建监听器对象,并注册事件
MyMonitor myMonitor = new MyMonitor();
b.addActionListener(myMonitor);
frame.pack();
frame.setVisible(true);
}
}
// 事件监听器
class MyMonitor implements ActionListener {
@Override
public void actionPerformed(ActionEvent actionevent) {
System.out.println("处理事件");
}
}
监听器一般使用内部类和匿名类实现
actionCommand属性
- 用于记录按钮/菜单类组件所触发的ActionEvent时间相关指令信息
这里写代码片
GUI主要事件类型层次
- 继承:Object<–EventObject<–AwtEvent
AwtEvent | ActionEvent |
AdjustmentEvent | |
ComponentEvent | FocusEvent |
InputEvent | KeyEvent |
MouseEvent | |
ContainerEvent | |
WindowEvent | |
ItemEvent | |
TextEvent |
参考:AWT事件及其相应的监听器接口(1)
多重监听器
这里写代码片
事件适配器类
- 针对大多数事件监听器接口定义的abstract方法,适配器类实现了所有这些方法,但不做任何事情
监听器接口 | 对应适配器类 | 说明 |
---|
- 监听器只能继承一个适配器类(Java单继承)
AWT组件
参考:AWT与Swing使用区别
AWT常用组件
文本组件:文本框/文本域
- 文本框:TextFied
- 文本域:TextArea,如留言板功能
菜单组件:菜单条/菜单/菜单项/复选菜单项/弹出菜单
- 菜单组件:MenuBar/Menu/MenuItem/CheckboxMenuItem
- 多级菜单:Menu下挂Menu对象,Menu/MenuItem
- 弹出式菜单: PopupMenu/MenuItem
延伸:弹出式菜单事件处理需要在mousePressed()/mouseReleased()方法中处理,参考isPopupTrigger()
下拉选择框/列表框/复选框
- 选择组件:Choice
- 列表框:List
- 复选框:CheckboxGroup/Checkbox
对话框组件:对话框/文件对话框
- 对话框:Dialog
- 文件对话框:FileDialog,如文本文件编辑器
文件对话框的模式为FileDialog.LOAD或FileDialog.SAVE
滚动组件:滚动条/滚动面板
- 滚动条:Scrollbar
方向:Scrollbar.HORIZONTAL 或 Scrollbar.VERTICAL
可见量(visible amount):可考虑设置为0,滚动条的实际最大值是 maximum 减去 visible amount
// 例子中,maximum 是 300,visible amount 是 60,所以实际最大值是 240。滚动条轨道的范围是 0 - 300 ranger = new Scrollbar(Scrollbar.HORIZONTAL, 0, 60, 0, 300);
- 滚动面板:ScrollPane
滚动条的显示策略可以设置如下:
- as needed(SCROLLBARS_AS_NEEDED): 创建滚动条,且只在滚动窗格需要时显示
- always(SCROLLBARS_ALWAYS): 创建滚动条,且滚动窗格总是显示滚动条
- never(SCROLLBARS_NEVER): 滚动窗格永远不创建或显示滚动条
- 滚动条:Scrollbar
AWT视觉控制类
- java.awt.Color类
- RGB颜色
这里写代码片
- java.awt.Font类
- 字体:名称、样式、大小
这里写代码片
AWT绘图
- 绘图原理:重写Component类paint()方法,加入所需绘图逻辑
public void paint(Graphics g)
java.awt.Graphics支持两种绘图方式:
- 基本绘图:画线、多边形、圆、填充图形和文字等
- 绘制图像:图像显示
java.awt.Canvas画布
- 继承:Object<–Component<–Canvas
- 跟Panel类似,但不是容器类,不能包含其他组件
- Canvas 组件表示屏幕上一个空白矩形区域,应用程序可以在该区域内绘图,或者可以从该区域捕获用户的输入事件
- 程序自动调用Component的paint(Graphics g)方法
Java小程序(Applet)
java.applet.Applet
- 通常用于网页中
继承:Panel<–Applet
两种运行方式:
- IE浏览器
- AppletViewer
- Applet vs. Application
- 运行方式:Applet不能单独运行,通常嵌入在网页里,在浏览器下运行;Application是固定入口方法main()运行的
- 性能:Applet与Application相比,运行速度更慢、功能更少
- 安全性要求:Applet随网页自动下载到客户端运行,安全要求更高
重写init()/paint()方法
// java
public class TestApplet extends Applet {
@Override
public void init() {
this.setBackground(Color.CYAN);
}
@Override
public void paint(Graphics g) {
g.drawString("测试Applet", 100, 150);
}
}
// html源文件
<html>
<applet code="HelloWorld.class" width=200 height=150></applet>
</html>
参考:
1. applet路径问题总结
2. “中”安全级别已从 Java 控制面板中删除
IE浏览器
JDK7
JDK8
java控制台是否显示
AppletViewer
一般用于开发过程中的测试。appletviewer test.html
延伸:JAVA出现警告无法读取 AppletViewer 属性文件的解决方法
Applet运行机制
- Applet默认为FlowLayout布局
- Applet生命周期
- public void init();
- 首次启动调用,进入初始态
- public void start();
- 调用后进入运行态
- public void stop();
- 调用后进入停止态;start()和stop()可循环调用
- public void destroy();
- 关闭浏览器时调用,进入消亡态
- public void init();
- Applet安全策略
- 沙箱
- Applet插件标记
code
/width
/height
/[archive
/codebase
/alt
/name
/align
/vspace
/hspace
]
<param name="XXX" value="xxx" />
最后
以上就是迷人小松鼠为你收集整理的Java学习12 GUI程序设计(AWT)FramePanel布局管理器容器的嵌套使用GUI事件处理AWT组件AWT视觉控制类AWT绘图Java小程序(Applet)的全部内容,希望文章能够帮你解决Java学习12 GUI程序设计(AWT)FramePanel布局管理器容器的嵌套使用GUI事件处理AWT组件AWT视觉控制类AWT绘图Java小程序(Applet)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复