- 简述Graphics类的特征。
Graphics类是java.awt包中一个特殊的抽象类,当要在屏幕上绘制图形、文本、图像时,并不需要直接使用new运算符来创建一个Graphics类的对象实例,而是可以直接使用,Graphics类所产生的对象就是被成为绘画环境的“绘图区域”。与一般类不同的是,被称为“绘图区域”的对象并不需要通过Graphics类的构造方法来创建,而是通过getGraphics()方法来取得。有了这个“绘图区域”后,便可以利用Graphics类所提供的各种各样的绘图方法来进行图形绘制, - Java语言中提供的用于显示、更新和重画图形的方法有哪几个?
图形显示:public void paint(Graphics g);
更新图形:public void update(Graphics g);
重画图形:public void repaint(); public void repaint(int x, int y, int width, int height);
- paint()方法什么情况发生时会自动被调用。
(1)当新建窗口显示在显示器上或从隐藏变成显示时;
(2)从缩小图标还原为正常显示之后;
(3)正在改变窗口的大小时。 - 编写一个画图的程序,用户可以用单选按钮组或下拉列表框选择所要绘制的图形,如线、圆、椭圆、矩形等,选择后可以通过拖动鼠标的方式在屏幕上画出相应的图形。
import java.awt.*;
import java.awt.event.*;
public class exe14_4 extends Frame implements ItemListener, MouseMotionListener, MouseListener {
static exe14_4 frm = new exe14_4();
static Checkbox cb1 = new Checkbox("线");
static Checkbox cb2 = new Checkbox("圆");
static Checkbox cb3 = new Checkbox("椭圆");
static Checkbox cb4 = new Checkbox("矩形");
static Choice cho = new Choice();
static final int LINE = 0;
static final int CIRCLE = 1;
static final int OVAL = 2;
static final int RECT = 3;
int px1, py1, px2, py2;
static int status = 0, sharp = 0;
int rpx1, rpy1, rpx2, rpy2;
public static void main(String[] args) {
CheckboxGroup grp = new CheckboxGroup();
cb1.setCheckboxGroup(grp);
cb2.setCheckboxGroup(grp);
cb3.setCheckboxGroup(grp);
cb4.setCheckboxGroup(grp);
cb1.addItemListener(frm);
cb2.addItemListener(frm);
cb3.addItemListener(frm);
cb4.addItemListener(frm);
cho.add("线");
cho.add("圆");
cho.add("椭圆");
cho.add("矩形");
cho.addItemListener(new MyItemListener());
frm.setTitle("exe14_4");
frm.setLocation(200, 150);
frm.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 10));
frm.setSize(400, 300);
frm.add(cb1);
frm.add(cb2);
frm.add(cb3);
frm.add(cb4);
frm.add(cho);
frm.addMouseMotionListener(frm);
frm.addMouseListener(frm);
frm.setVisible(true);
}
public void itemStateChanged(ItemEvent e) {
Checkbox cb = (Checkbox) e.getSource();
if (cb == cb1) {
sharp = LINE;
} else if (cb == cb2) {
sharp = CIRCLE;
} else if (cb == cb3) {
sharp = OVAL;
} else if (cb == cb4) {
sharp = RECT;
}
}
public void mouseMoved(MouseEvent e) {
px1 = e.getX();
py1 = e.getY();
status = 0;
}
public void mouseDragged(MouseEvent e) {
Graphics g = getGraphics();
g.setColor(Color.yellow);
g.setXORMode(Color.black);
if (status == 1) {
switch (sharp) {
case LINE:
g.drawLine(px1, py1, e.getX(), e.getY());
break;
case CIRCLE:
g.drawOval(px1, py1, px2, px2);
break;
case OVAL:
g.drawOval(px1, py1, px2, py2);
break;
case RECT:
g.drawRect(px1, py1, px2, py2);
break;
}
} else {
px1 = e.getX();
py1 = e.getY();
status = 1;
}
px2 = Math.abs(e.getX() - px1);
py2 = Math.abs(e.getY() - py1);
switch (sharp) {
case LINE:
g.drawLine(px1, py1, e.getX(), e.getY());
break;
case CIRCLE:
g.drawOval(px1, py1, px2, px2);
break;
case OVAL:
g.drawOval(px1, py1, px2, py2);
break;
case RECT:
g.drawRect(px1, py1, px2, py2);
break;
}
rpx1 = px1;
rpy1 = py1;
rpx2 = px2;
rpy2 = py2;
}
public void mouseReleased(MouseEvent e) {
Graphics g = getGraphics();
g.setColor(Color.red);
switch (sharp) {
case LINE:
g.drawLine(rpx1, rpy1, e.getX(), e.getY());
break;
case CIRCLE:
g.drawOval(rpx1, rpy1, rpx2, rpx2);
break;
case OVAL:
g.drawOval(rpx1, rpy1, rpx2, rpy2);
break;
case RECT:
g.drawRect(rpx1, rpy1, rpx2, rpy2);
break;
}
}
public void mousePressed(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {}
public void mouseExited(MouseEvent e) {}
public void mouseClicked(MouseEvent e) {}
static class MyItemListener implements ItemListener {
public void itemStateChanged(ItemEvent e) {
String clr = cho.getSelectedItem();
if (clr == "线") {
sharp = LINE;
} else if (clr == "圆") {
sharp = CIRCLE;
} else if (clr == "椭圆") {
sharp = OVAL;
} else if (clr == "矩形") {
sharp = RECT;
}
}
}
}
注:练习均为博主自己编写,不是标准答案,可能存在问题,可以留言讨论。