动作事件
动作事件与前面三种事件有所不同,它不代表某个具体的动作,只是表示一个动作发生了。例如,在关闭一个文件时,可以通过键盘关闭,也可以通过鼠标关闭,但是我们不需要关心使用哪种方式对文件进行关闭,只要是对关闭按钮进行操作,即出发了动作事件。
在Java中动作事件用ActionEvent类表示,处理ActionEvent 事件的监听器对象需要实现ActionListener接口,但监听器对象在监听动作时,不会像鼠标事件一样处理鼠标个别的移动和单机的细节,而是去处理“按钮按下”这样有意义的事件。
布局管理器
在java.awt包中提供了五种布局管理器,分别是FlowLayout(流式布局管理器)、BorderLayout(边界布局管理器)、GridLayout(网格布局管理器)、GridBagLayout(网格包布局管理器)和CardLayout(卡片布局管理器)。
每个容器在创建时都会使用一种默认的布局管理器,在程序中可以通过调用容器对象的setLayout()方法设置布局管理器,通过布局管理器来自动进行组件的布局管理。
1、FlowLayout
流式布局管理器是最简单的布局管理器,在这种布局下,容器会将组件按照添加顺序从左往右放置。当到达容器的边界时,会自动将组件放到下一行的开始位置。
FlowLayout的构造方法:
其中,参数align决定组件在每行中相对于容器边界的对齐方式,可以使用该类中提供的常量作为参数传递给构造方法,FlowLayout.LEFT用于表示左对齐,FlowLayout.RIGHT用于表示右对齐,FlowLayout.CENTER用于表示居中对齐,参数hgap和参数vgap分别设定组件之间的水平和垂直间距。
public class Demo01_FlowLayout {
public static void main(String[] args) {
Frame frame = new Frame("我的窗口");
frame.setSize(500,300);
frame.setLocation(500,500);
frame.setVisible(true);
frame.setLayout(new FlowLayout(FlowLayout.LEFT,30,20));
Button b1 = new Button("button1");
frame.add(b1);
b1.addActionListener(new ActionListener() {
int num = 2;
@Override
public void actionPerformed(ActionEvent e) {
frame.add(new Button("button" + num++));
frame.setVisible(true);
}
});
}
}
FlowLayout布局管理器的特点就是可以将所有组件想流水一样一次进行排列,不需要用户明确设定,但是在灵活性上相对差了点。
BorderLayout
BorderLayout(边界布局管理器)是一种较为复杂的布局方式,它将容器分为五个区域,分别是东(EAST)、南(SOUTH)、西(WEST)、北(NORTH)、中(CENTER)。
当向BorderLayout布局管理器的容器中添加组件时,需要使用add(Component comp,Object constraints)方法,其中参数contraints是Object类型,在传参时可以使用BorderLayout类提供的5个常量,分别是EAST、SOUTH、WEST、NORTH、CENTER。
public class Demo02_BorderLayout {
public static void main(String[] args) {
Frame frame = new Frame("我的窗口");
frame.setVisible(true);
frame.setSize(400,300);
frame.setLocation(500,500);
frame.setLayout(new BorderLayout());
Button b1 = new Button("EAST");
Button b2 = new Button("WEST");
Button b3 = new Button("SOUTH");
Button b4 = new Button("NORTH");
Button b5 = new Button("CENTER");
frame.add(b1,BorderLayout.EAST);
frame.add(b2,BorderLayout.WEST);
frame.add(b3,BorderLayout.SOUTH);
frame.add(b4,BorderLayout.NORTH);
frame.add(b5,BorderLayout.CENTER);
}
}
BorderLayout的好处就是可以限定各区域的边界,当用户改变容器大小时,各个组件的相对位置不变。但需要注意的是,向BorderLayout的布局管理器添加组件时,如果不指定添加到哪个区域,则默认添加到CENTER区域,并且每个区域只能放置一个组件,如果想一个区域中添加多个组件,则后放入的组件会覆盖先放入的组件。3、GridLayout
GridLayout(网格布局管理器)使用纵横线将容器分为n行n列大小相等的网格,每个网格中放置一个组件。添加到容器中的组件首先放置在第1行第1列的网格中,然后在第1行的网格中从左到右依次放置其他组件,行满后,继续在下一行中从左往右放置组件。与FlowLayout不同的是,放置在GridLayout布局管理器中的组件将自动占据网格的整个区域。
GridLayout的构造方法:
其中,参数rows代表行数,参数cols代表列数,hgap和vgap规定水平和垂直方向的间距。
public class Demo03_GridLayout {
public static void main(String[] args) {
Frame frame = new Frame("我的窗口");
frame.setVisible(true);
frame.setSize(400,300);
frame.setLocation(500,500);
frame.setLayout(new GridLayout(3,3));
for(int i = 1; i <= 9; i ++){
Button button = new Button("button" + i);
frame.add(button);
}
}
}
GridLayout布局管理器的特点就是组件的相对位置不随区域的缩放而改变,但组件的大小会随之改变,组件始终占据网格的整个区域。缺点是总是忽略组件的最佳大小,所有组件的宽高相同。
public class Demo {
public static void main(String[] args) {
Frame f = new Frame("布局");
f.setVisible(true);
f.setSize(300,300);
Button b1 = new Button("East");
Button b2 = new Button("West");
Button b3 = new Button("South");
Button b4 = new Button("North");
Panel panel = new Panel();
panel.setLayout(new GridLayout(3,3));
for (int i = 1; i <= 9; i++) {
Button b = new Button(String.valueOf(i));
panel.add(b);
}
f.add(b1,BorderLayout.EAST);
f.add(b2,BorderLayout.WEST);
f.add(b3,BorderLayout.SOUTH);
f.add(b4,BorderLayout.NORTH);
f.add(panel,BorderLayout.CENTER);
}
}
Panel无法单独显示,必须添加到某个容器中。
当把Panel作为一个组件添加到某个容器中后,该Panel仍然可以有自己的布局管理器。
AWT绘图
很多GUI程序都需要在组件上绘制图形,比如实现一个五子棋的小游戏,就需要在组件上绘制棋盘和棋子。在java.awt包中专门提供了一个Grapfics类,它相当于一个抽象的画笔,其中提供了各种绘制图形的方法,使用Graphics类的方法就可以完成在组件上绘制图形。
Graphics类常用方法:
方法声明 ——功能描述
void setColor(Color c) ——将此图形上下文的当前颜色设置为指定颜色
void setFont(Font f) ——将此图形上下文的字体设置为指定字体
void drawline(int x1,int y1,int x2,int y2) —— 以(x1,y1)和(x2,y2)为端点绘制一条线段
void drawRect(int x,int y,int width,int height) ——绘制指定矩形的边框,矩形的左边缘和右边缘分别位于x和x+width,上边缘和下边缘分别位于y和y+height
void drawOval(int x,int y,int width,int height) ——绘制椭圆的边框,得到一个圆或椭圆,它刚好能放入由x、y、width和height参数指定的矩形中,椭圆覆盖区域的宽度为width+1像素,高度为height+1 像素
void fillRect(int x,int y,int width,int height) ——用当前颜色填充指定的矩形,该矩形左边管和在右边缘分别位于x和x+width-1,上边缘和下边缘分别委员y和y+height-1
void fillOval(int x,int y,int width,int height) ——用当前颜色填充外接指定矩形框的椭圆
void drawString(String str,int x,int y) ——使用当前上下文的当前字体和颜色绘制指定的文本str,最左侧字符左下角位于(x,y)坐标
setColor():用于指定上下文颜色,方法中接收一个Color类型的参数,Color类嗲表颜色,其中定义了许多代表个中颜色的常量,比如Color.RED、Color.BLUE等都是Color类型。
setFont():用于指定上下文字体,方法中接收一个Font类型的参数,Font类型嗲表字体,可以使用new关键字创建Font对象。Font的构造方法中接收三个参数,第一个是String类型,表示字体名称,例如宋体、微软雅黑等;第二个参数是int类型,表示字体的样式,接收Font类的三个常量Font.PLAINT、Font.ITALIC和 Font.BOLD;第三个参数为int类型,表示字体大小。
drawRect()和drawOval():用于绘制矩形和椭圆形的边框,fillRect()和fillOval()用于使用当前的颜色填充绘制的矩形和椭圆形。
drawString():用于绘制一段文本,第一个参数str表示绘制的文本内容,第二个和第三个参数x、y为绘制文本的左下角坐标。
public class Test {
public static void main(String[] args) {
Frame f = new Frame("绘画");
f.setVisible(true);
f.setLocation(500,500);
f.setSize(400,400);
MyPanel2 panel = new MyPanel2();
f.add(panel);
}
}
class MyPanel2 extends Panel {
@Override
public void paint(Graphics g) {
g.setColor(Color.red);
g.drawLine(100,100,200,200);
g.setColor(Color.blue);
g.drawRect(100,100,200,200);
g.setColor(Color.black);
g.drawOval(100,100,200,200);
//g.fillOval(100,100,200,200);
}
}