awt 是 Java 中用来做界面开发的类库,相当于接口,具体是由 JVM 调用本地操作系统的图形界面来实现的。(尽管这样理解 awt 并不准确,但对于简单了解完全够了,没有任何问题,一定要学会自己主动去简化问题)
当然 awt 存在很多问题,所以后来 JDK1.2 中又提供了 swing 这一套 GUI 类库作为补充和优化。swing 则采用 100% 的 Java 实现,不再依赖于本地操作系统的图形界面,在所有平台上都能有相同的运行效果,功能也更强大。
awt 基本组件
_awt 界面类层次图.pngawt 中所有界面组件的父类就是 java.awt.Component 类(Component 名词n,组成成分、零部件的意思),所以这里将所有界面组件的父类定义为 Component 的含义应该是把这些界面控件当成是一个个独立的零部件来看待,让它们互相组合去构建一个复杂的画面吧。我猜测的,这样可以更好的理解。毕竟编程是用英文书写,很多时候理解英文命名含义能够更好的理解技术点。
Component 的直接子类中使用的比较多的有 Button 、Checkbox 、 Choice 、Label 、TextComponent 类,以后实际用到了再来做记录。
Component 子类中较为特殊的就是 Container 类了,它是一个可以存储其他 Component 组件的容器,直接子类 Panel 可以用来存放其他组件,对这个面板上的组件进行统一操作管理。还有一个 Frame 类,是一个窗口类,英文含义框架、界面、画面帧的意思,所有组件都要放在这个框架窗口上才能够得以展现。
布局管理器
各个界面组件当然不能随意摆放,无论是从使用还是美观上考虑,都必须要有好的布局才行。布局管理器就相当于一个容器组件的大管家,专门用来管理容器中的组件。public void setLayout(LayoutManager mgr)
方法是 Container 容器组件提供的一个实现方法,这也就是说,只有容器组件类才能够拥有布局管理的功能。好像又是废话,只有容器组件类才能够添加其他组件啊,才需要进行布局管理,其他组件也不需要啊。
常用的几种布局管理器有 FlowLayout 、BorderLayout 、GridLayout 、GridBagLayout ,它们都是实现了 LayoutManager 接口的实现类。设定布局管理器的方法public void setLayout(LayoutManager mgr)
中接收的参数就是 LayoutManager 类型的接口变量啊。
其中 Panel 的默认布局管理器是 FlowLayout ,Frame 的默认布局管理器是 BorderLayout 。
具体各个布局管理器的特性,到时候计算器项目中用到了,再来总结记录。
awt 事件机制
单纯的一个界面当然是不够的,一定要有和用户的交互方式。这就不可避免的离不开事件处理机制了。要理解事件处理机制,必须要理解事件源、事件、事件监听器三个概念。
事件源,也就是产生事件的源头。就是前面讲到的 awt 界面组件啊!事件,是一个由事件源接收到的外部动作封装而来的一个描述事件源状态改变的对象。事件监听器,是专门设计来监听事件源是否发生了指定的事件的一个工具。
一个事件源可以被多个事件监听器同时监听。
关于事件源,也就是这些界面组件都位于 java.awt 中,事件和事件监听器都位于 java.awt.event 中。Java 的事件处理机制设计的非常有逻辑性,下面举一个例子,其他都是类似的。
以 Button 的单击事件为例,首先给 Button 事件源添加事件监听器,然后将实现了对应事件监听器接口的实现类作为参数传递给事件源的监听器方法。事件有了,事件监听器实现类有了,系统当然能够自己去执行对应的逻辑了啊。这个时候代码示例如下:
Button btn = new Button("提交");
btn.addActionListener(new CommitAction());
class CommitAction implements ActionListener{
void actionPerformed(ActionEvent e){
// 执行单击按钮后需要进行的操作
}
}
java.awt.event 中的类设计得很有规则,事件监听器接口名、事件名、事件监听器适配器类名都是对应设计的。
再给事件源的addxxxListener(xxxListener l)
传递参数时,可以有三种方式,上面传递实现接口的实现类是一个方式。
第二种方式是,定义一个类继承对应的事件监听器适配器类。因为一个接口中可能有多个抽象方法,实际使用中可能只需要重写一个方法就够了,但是限于语法的限定,又必须要实现所有的方法,这就带来很大的冗余性。所以提供了对应的适配器类来给所有的抽象方法都提供了方法的空实现,所以只需要继承适配器类,重写需要的方法就可以了。
class keyCommit extends KeyAdapter{
//重写需要重写的方法就可以了
}
第三种方式是直接在方法的内部提供一个匿名内部类对象。为什么叫做匿名呢?就是不命名类的名字就直接进行对象的创建,匿名内部类因为没有名字,拿不到句柄,所以只能用一次。new 后面可以接类名或者接口名,这都是在直接创建对象!内部类引出了私有内部类,私有内部类引出了匿名内部类。
btn.addMouseListener(new MouseAdapter() {
public void mouseClicked(MouseEvent mevent){
// 执行需要进行的操作
}
});
网友评论