一、Java GUI
分为两种:1. AWT(Abstract Window Toolkit), 抽象窗口工具集,第一代的 Java GUI 组件,是重量级的。
2. Swing,不依赖于底层细节,轻量级的组件。
package com.bob.awt;
import java.awt.Color;
import java.awt.Frame;
import java.awt.Panel;
public class MyFrame extends Frame {
public MyFrame(String title){
super(title);
}
public static void main(String[] args) {
MyFrame frame = new MyFrame("My first frame");
frame.setSize(400, 400);
frame.setBackground(Color.BLACK);
Panel panel = new Panel(); //添加面板
panel.setSize(200, 200);
panel.setBackground(Color.BLUE);
frame.setLayout(null); //不使用布局管理器
frame.add(panel); //将面板添加到框架内
frame.setVisible(true);
}
}
package com.bob.awt;
import java.awt.Button;
import java.awt.FlowLayout;
import java.awt.Frame;
public class MyFlow {
private Frame frame;
private Button button1, button2, button3;
public void go(){
frame = new Frame("My first flow");
//使用FlowLayout替换掉默认的BorderLayout布局管理器
frame.setLayout(new FlowLayout());
button1 = new Button("hello");
button2 = new Button("world");
button3 = new Button("welcome");
frame.add(button1);
frame.add(button2);
frame.add(button3);
frame.setSize(100, 100);
frame.setVisible(true);
}
public static void main(String[] args) {
MyFlow gui = new MyFlow();
gui.go();
}
}
BorderLayout: 默认添加到中间,如果有多个则会覆盖上一个。
FlowLayout:流式的管理器。默认从左到右排列,空间太小则自动到下一行。
Grid: 表格式的布局管理器。可以设置表格行列。
总结:
· Frame: 是一个顶级窗口,缺省布局管理器为 Borderlayout。
Panel: 无法单独显示,必须添加到某个容器中。缺省布局管理器为FlowLayout。
二、 AWT 事件模型
什么是事件:
事件 --- 描述发生了什么的对象
事件源 --- 事件的产生器。
事件处理器 --- 接受事件、解释事件并处理用户交互的方法
package com.bob.awt;
import java.awt.BorderLayout;
import java.awt.Button;
import java.awt.Frame;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class TestButton {
public static void main(String[] args) {
Frame frame = new Frame("Event");
Button button = new Button("press me!");
//此方法接受一个接口类型参数。使用时接口中的方法会自动得到调用
button.addActionListener(new ButtonHandler()); //添加事件处理器
frame.add(button,BorderLayout.CENTER);
frame.pack(); //按钮自动适应窗口
frame.setVisible(true);
}
}
//自定义类实现ActionListener接口
class ButtonHandler implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) { //ActionEvent对象保存了事件源的信息
String lable = e.getActionCommand(); //获得按钮标签
System.out.println(lable);
}
}
---在Button对象上用鼠标进行点击时,将发送一个 ActionEvent 事件。这个ActionEvent 事件会被使用 addActionListener 的 actionPermed() 方法接收。
总结:当单击一个按钮时就会产生一个事件(ActionEvent),然后检查是否与该按钮关联的事件处理器(实际上就是一个方法),如果没有,那么什么都不执行;如果有,就会将该事件传递给与该按钮关联的事件处理器,作为该方法的参数,之后该事件处理器方法就会自动得到调用,并且该方法可以使用传递过来的 ActionEvent 对象,进而获得事件发生时与该事件及事件源相关联的那些信息。
·Java 中的组件若想添加事件处理器,都会使用形如 addXxxListener 的方法添加。
三、 事件 Adapters(适配器)
作用: 你可以继承 Adapters 类,而且只需要重写你所需要的方法。
·为简化编程,JDK针对大多数事件监听器接口定义了相应的实现类,我们称之为事件适配器(Adapter)类。
四、Swing:第二代GUI工具,建立在AWT之上,使用新版本的组件替代了旧版本的组件。提供了许多新的组件和相关API。
· Swing Components 分类: 顶层容器、中间容器、原子组件。
顶层容器:JFrame,JDialog,JApplet。
中间容器: