简述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
;
}
}
}
}
注:练习均为博主自己编写,不是标准答案,可能存在问题,可以留言讨论。