目录:一.GUI简述 二.常用的AWT组件 三.布局管理器 四.AWT事件处理 五.GUI组件上的图形操作
一.GUI简述
GUI全称是Graphical User Interface,即图形用户界面。
JDK中提供了AWT和Swing两个包,用于GUI程序的设计和开发,Swing为在AWT基础上改进。
AWT为重量型组件,SWING为轻量型组件,开发中建议使用Swing组件。
程序的GUI部分由AWT线程管理
test:让框架窗口显示5秒钟后关闭,查AWT的线程状态
二.常用的AWT组件:
GUI组件可以分为两大类,基本组件和容器,分别是java.awt.Component和java.awt.Container的直接或者间接子类
1.Container:容器显示以后,就不能添加新的组件了,否则无法显示
a.Container类是所有容器类的父类,Container.add方法用于将组件添加到容器中
b.Container也是Component的子类,因此也可以作为组件增加到其他容器上。
|--Container
|-- Window:Frame、Dialog BorderLayout
|--Panel:Applet FlowLayout
Dialog与FileDialog:对话框不能独立存在,需要有一个上级窗口
a.Dialog类用于产生对话框
b.模态对话框与非模态对话框:模态对话框时不能进行窗口其他操作。
c.Dialog类的两个常用构造方法:
public Dialog(Frame owner,String title);
public Dialog(Frame owner,String title,boolean modal);
public static void main(String[] args) {
/ 1.创建Frame组件:
Frame frame = new Frame("frame title");
/ 2.设置Frame组件属性:长宽及可见
frame.setSize(300,300);
frame.setVisible(true);
}
2.GUI最基本的元素就是组件
MenuComponent:菜单组件基类,也称为超类,其下有MenuBar、Menu、MenuItem
Component:与菜单不相关的组件基类,也称为超类
Canvas:
a.是具有最基本的和最简单的GUI功能的组件
b.代表屏幕上的一块空白的矩形区域,程序能够在这个部件表面绘图,
也能够捕获用户的操作,产生相应的事件
c.当要设计自定义的具有GUI功能的组件类时,继承Canvas将会大大简化编程难度
Component常用组件:Button、Label、CheckBox、TextComponent( TextArea、TextField)
容器通过add方法来添加这些组件。
public static void main(String[] args) {
Frame frame = new _4ButtonOfFrameTest1().frame;
frame.setVisible(true);
frame.setSize(300,300);
// 1.设置并通过窗口的add方法添加Button
Button btn = new Button("hello");
btn.addActionListener(new _4ButtonOfFrameTest1());
frame.add(btn);
}
三.布局管理器:容器中的组件排列方式
常见的布局管理器:
1)FlowLayout:流式布局管理器,从左向右排列,是Panel默认的布局管理器
2)BorderLayout:边界式布局管理器,东南西北中的排列方式,是Frame的默认布局管理器
3)GridLayout:网格式布局管理器,规则的矩阵
4)CardLayout:卡片式布局管理器,即选项卡
5)GridBayLayout:网格包布局管理器,非规则矩阵
public static void main(String[] args) {
/ 1.创建并设置窗体
final Frame frame = new Frame("button of frame3");
frame.setVisible(true);
frame.setSize(300, 300);
/ 2.设置布局管理器
frame.setLayout(new FlowLayout());
/ 3.添加组件,其显示效果为布局管理器设置
frame.add(new Button("yes"));
frame.add(new Button("no"));
}
四.AWT事件处理机制:事件监听器,它是一个接口,需要进行实现
处理发生在某个GUI组件上的XxxEvent事件的某种情况,其事件处理的通用编写流程:
1.编写一个实现了XxxListener接口的事件监听器类
2.XxxListener类中的用于处理该事件情况的方法中,编写处理代码
3.调用组件的addXxxListener方法,将类XxxListener创建的实例对象注册到GUI组件上。
class MyWindowAdapter extends WindowAdapter{
@Override
// 使用注解防止覆盖方法形式错误
public void windowClosing(WindowEvent e){
Window window = e.getWindow();
window.setVisible(false);
window.dispose();
System.exit(0);
}
}
五.GUI组件上的图形操作
1.绘制图形和图形重绘
Graphics类与图形绘制
Component.getGraphics方法与Graphics类
Graphics.drawLine(int x1, int y1, int x2, int y2)方法
Graphics.drawString(String str, int x, int y)方法
Graphics.drawString方法的坐标参数(相对于左上角而言)
AWT线程对组件重绘的调用过程:见图解(曝光即为改变大小了,如最小化最大化)。
2.显示图片和双缓冲技术
图像显示:
使用Graphics.drawImage(Image img,int x,int y,ImageObserver observer)方法显示图像。
使用Component.getToolkit.getImage(String path)语句获得Image实例对象。
//此时的图片显示是通过paint方法完成的,内部有自己的实现机制,我们正常使用drawImage方法即可。而且解决了曝光后的重绘问题。
class MainFrame1 extends Frame{
Image img = getToolkit().getImage("images/girl.jpg");
public MainFrame1(){
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
repaint();
}
@Override
public void paint(Graphics g){
g.drawImage(img, 0, 0, this);
}
}
在前面使用paint绘制直线和图片的时候,需要存储每个图形元素的信息,如果元素较多且复杂,消耗资源严重
双缓冲区技术:
Component.createImage方法创建内存Image对象
在Image对象上进行绘制的结果就成了一幅图像
在Image对象执行与组件表面同样的绘制,Image对象中的图像时组件表面内容的复制,当组件重画时,只需将内存中的Image对象在组件上画出。
当组件上图像较多时,效率会明显提升。
class MainFrame2 extends Frame{
int orgX,orgY,endX,endY;
Graphics og = null;
Image oimg = null;
//问题:如何在曝光后连带g的基本属性也都恢复?
@Override
public void paint(Graphics g){
if(oimg!=null){
g.drawImage(oimg, 0, 0, this);
}
}
public MainFrame2(){
this.setSize(700,1000);
this.setTitle("mainFrame2");
//设置显示为ture时,会调用paint方法,此时oimg尚未创建,所以paint方法编译时
//会报空指针异常,改进方式如上。
this.setVisible(true);
Dimension d = this.getSize();
oimg = this.createImage(d.width, d.height);
og = oimg.getGraphics();
this.addMouseListener(new MouseAdapter(){
@Override
public void mousePressed(MouseEvent e){
orgX = e.getX();
orgY = e.getY();
System.out.println("world");
}
@Override
public void mouseReleased(MouseEvent e){
endX = e.getX();
endY = e.getY();
Graphics g = getGraphics();
g.setColor(Color.RED);
System.out.println("hello");
g.drawLine(orgX, orgY, endX, endY);
og.drawLine(orgX, orgY, endX, endY);
}
});
this.addWindowListener(new WindowAdapter(){
@Override
public void windowClosing(WindowEvent e){
dispose();
System.exit(0);
}
});
}
}