组件绘图原理:
之前我们已经学习过很多组件,例如Button、Frame、Checkbox等等,不同的组件,展现出来的图形都不一样,其实这些组件展示出来的图形,其本质就是用AWT的绘图来完成的。
在AWT中,真正提供绘图功能的是Graphics对象,那么Component组件和Graphics对象存在什么关系,才能让Component绘制自身图形呢?在Component类中,提供了下列三个方法来完成组件图形的绘制与刷新。
paint(Graphics g)绘制组件的外观
update(Graphics g)内部调用paint方法,刷新组件外观
repaint():调用update方法,刷新组件外观
一班情况下,update和paint方法是由AWT系统负责调用,如果程序要希望系统重新绘制组件,可以调用repaint()方法完成。
Graphics对象的使用:
AWT中提供了Canvas类充当画布,提供了Graphics类来充当画笔,通过调用Graphics对象的setColor()方法可以给画笔设置颜色。
画图的步骤:
1.自定义类,继承Canvas类,重写paint(Graphics g)方法完成画图;
2.在paint方法内部,真正开始画图之前调用Graphics对象的setColor()、setFont()等方法设置画笔的颜色、字体等属性。
3.调用Graphics画笔的drawXxx()方法来画图。
package com.aynu.layout;
import java.awt.*;
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class SimpleDraw {
private final String RECT_SHAPE="rect";
private final String OVAL_SHAPE="oval";
private Frame frame = new Frame("这里测试绘图");
Button btnRect = new Button("绘制矩形");
Button btnOval = new Button("绘制椭圆");
//定义一个变量,记录当前要绘制椭圆还是矩形
private String shape ="";
//自定义类继承Canves类重写paint(Graphics g)方法完成画图。
private class MyCanvas extends Canvas{
@Override
public void paint(Graphics g) {
//绘制不同的图形
if (shape.equals(RECT_SHAPE)){
//绘制矩形
g.setColor(Color.black); //设置画笔颜色为黑色
g.drawRect(100,100,150,100);
} else if (shape.equals(OVAL_SHAPE)){
//绘制椭圆
g.setColor(Color.RED); //设置画笔颜色为红色
g.drawOval(100,100,150,100);
}
}
}
//创建自定义的画布对象
MyCanvas drawArea = new MyCanvas();
private void init(){
//组装视图
btnRect.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//修改标记的值为rect
shape=RECT_SHAPE;
drawArea.repaint();
}
});
btnOval.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//修改标记的值为oval
shape=OVAL_SHAPE;
drawArea.repaint();
}
});
//创建Panel,承载按钮
Panel p= new Panel();
p.add(btnRect);
p.add(btnOval);
frame.add(p, BorderLayout.SOUTH);
//drawArea的大小需要设置
drawArea.setPreferredSize(new Dimension(300,300));
frame.add(drawArea);
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
new SimpleDraw().init();
}
}