第一次做java awt,非常简单的小作业,注释写的很详细,
如果能对刚学java的朋友有点点帮助就好。
DrawLineWindow.java
import java.awt.Color;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Menu;
import java.awt.MenuBar;
import java.awt.MenuItem;
import java.awt.event.ActionEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.ActionListener;
import java.util.Vector;
/*继承自Frame的子类 */
public class DrawLineWindow extends Frame {
private static final long serialVersionUID = 7846501640220266812L;
/*记录鼠标按下及弹起的坐标 */
int fromX, fromY;
int toX, toY;
int width,height; //矩形的长和宽
int shapeType;//用于区分图形类型的变量
Vector<Object> lines = new Vector<Object>();//存储已绘制图形的数据
public DrawLineWindow() {
/*窗口监听器类 ,用于实现窗口右上角的红叉功能 */
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
System.exit(0);
}
});
/*鼠标操作的监听器类*/
addMouseListener(new MouseAdapter() {
/*鼠标按下 */
public void mousePressed(MouseEvent e){
fromX = e.getX();//得到x坐标
fromY = e.getY();//得到y坐标
}
/*鼠标释放 */
public void mouseReleased(MouseEvent e){
toX = e.getX();
toY = e.getY();
/*根据shapeType的值分类*/
if(shapeType==1){
lines.add(new MyLine(fromX, fromY, toX, toY));//向Vector数组添加MyLine元素
}
if(shapeType==2){
/*向Vector数组添加MyRectangle元素 下面是对坐标信息存入前的判断修正*/
if(toX > fromX){
width = toX-fromX;
}
else width =fromX-toX;
if(toY > fromY){
height = toY-fromY;
}
else height =fromY-toY;
if(fromX>toX && fromY>toY)
lines.add(new MyRectangle(toX,toY, width, height));
else if(fromX>toX && fromY<toY)
lines.add(new MyRectangle(toX,fromY, width, height));
else if(fromX<toX && fromY>toY)
lines.add(new MyRectangle(fromX,toY, width, height));
else
lines.add(new MyRectangle(fromX,fromY, width, height));
}
/*向Vector数组添加MyCircle元素 存入前判断方法如下*/
if(shapeType==3){
int r = toX-fromX;
if(fromX>toX && fromY>toY)
lines.add(new MyCircle(toX,toY,-r));
else if(fromX>toX && fromY<toY)
lines.add(new MyCircle(toX,fromY,-r));
else if(fromX<toX && fromY>toY)
lines.add(new MyCircle(fromX,toY,r));
else
lines.add(new MyCircle(fromX,fromY,r));
}
/*调用(重)绘图方法*/
repaint();
}
});
}
/*(重)绘图方法*/
public void paint(Graphics g){
g.setColor(Color.MAGENTA);//颜色
/*将Vector中已有的元素依次绘制 */
for(int i=0;i<lines.size();i++){
/*绘制前判断元素类型 */
if(lines.get(i)instanceof MyLine){//是line
MyLine l = (MyLine)lines.get(i);
l.draw(g);
g.drawString(fromX+","+fromY, fromX, fromY);
g.drawString(toX + "," + toY, toX, toY);
}else if(lines.get(i)instanceof MyRectangle){//是Rectangle
MyRectangle r = (MyRectangle)lines.get(i);
r.draw(g);
g.drawString(fromX+","+fromY, fromX, fromY);
g.drawString(toX + "," + toY, toX, toY);
}else if(lines.get(i)instanceof MyCircle){//是Circle
MyCircle c = (MyCircle)lines.get(i);
c.draw(g);
g.drawString(fromX+","+fromY, fromX, fromY);
g.drawString(toX + "," + toY, toX, toY);
}
}
}
/*菜单选项的监视器类,继承自ActionListener */
public class MenuItemListener implements ActionListener {
/*菜单选项相应,分别为shapeType设定不同数值 */
public void actionPerformed(ActionEvent e) {
if (e.getActionCommand().equals("Line")){
shapeType = 1;
} else if (e.getActionCommand().equals("Rectangle")) {
shapeType = 2;
} else if (e.getActionCommand().equals("Circle")) {
shapeType = 3;
}
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
DrawLineWindow f = new DrawLineWindow();/*声明一个DrawLineWindow类的实例*/
f.setBounds(300,150,600, 400);/*设置尺寸及位置*/
f.setTitle("Draw ");
MenuBar mb = new MenuBar();//创建一个菜单
f.setMenuBar(mb); //加入到frame中
Menu fm = new Menu("Shape ");
mb.add(fm);
//为菜单添加几个选项
fm.add( new MenuItem("Line"));
fm.add(new MenuItem("Circle"));
fm.add(new MenuItem("Rectangle"));
/*为menu添加动作监视器*/
fm.addActionListener(f.new MenuItemListener());
f.setVisible(true);
}
}
Myshape.java
import java.awt.*;
public abstract class MyShape {
public abstract void draw(Graphics g);//一个抽象方法
}
MyLine.java
import java.awt.Graphics;
public class MyLine extends MyShape{
private int fromX, fromY;
private int toX, toY;
/*构造函数*/
public MyLine(int x1, int y1, int x2, int y2){
fromX = x1;
fromY = y1;
toX = x2;
toY = y2;
}
/*父类抽象方法draw的实现*/
public void draw(Graphics g){
g.drawLine(fromX, fromY, toX, toY);
}
}
MyCircle.java
import java.awt.Graphics;
public class MyCircle extends MyShape{
private int centerX;//圆心x坐标
private int centerY;//圆心y坐标
private int radius;//圆的半径
/*构造函数*/
public MyCircle(int x1, int y1,int r1){
centerX = x1;
centerY = y1;
radius = r1;
}
/*父类抽象方法draw的实现*/
public void draw(Graphics g) {
g.drawOval(centerX, centerY, radius, radius);
}
}
MyRectangle.java
import java.awt.*;
public class MyRectangle extends MyShape{
private int fromX, fromY;//矩形左上角x坐标,y坐标
private int width, height;//矩形长和宽
/*构造函数*/
public MyRectangle(int x1,int y1,int w1,int h1){
fromX = x1;
fromY = y1;
width = w1;
height = h1;
}
/*父类抽象方法draw的实现*/
public void draw(Graphics g) {
g.drawRect(fromX, fromY, width, height);
}
}