日期:2014-05-20  浏览次数:20822 次

想用多态机制画图可是遇到难题了~~
如题,先给出代码:
//DrawPanel.java 画板类,完成画图和鼠标的响应
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
import java.util.*;

abstract class MyShape
{
abstract public void draw(Graphics g,int x,int y,int width,int height);
}


class MyRectangle extends MyShape
{
  public void draw(Graphics g,int x,int y,int width,int height)
{
g.drawRect(x,y,width,height);
}
}

class MyCircle extends MyShape
{
public void draw(Graphics g,int x,int y,int width,int height)
{
g.drawOval(x,y,width,height);
}
}



class DrawPanel extends JPanel
{

  int x1,y1,x2,y2;
  MyShape ms=null;
  ArrayList vt=new ArrayList();//存坐标
  ArrayList vt2=new ArrayList();//形状
   
  DrawPanel()
{
this.addMouseListener(new ml()); //鼠标按下//鼠标弹起
this.addMouseMotionListener(new nl()); //鼠标拖动事件
}

public void setshape(MyShape ms)
{
this.ms=ms;
}


public void cls()
{
vt.clear();
vt2.clear();
x1=y1=x2=y2=0;
currentShape=0;
repaint();
}

//重写绘图方法
public void paint(Graphics g)
{
g.clearRect(0,0,this.getWidth(),this.getHeight());

  for (int i = 0; i<vt.size(); i++)
{
Rectangle re=(Rectangle)vt.get(i);
 
int a=(re.x<re.width)?re.x:re.width;
int b=(re.y<re.height)?re.y:re.height;
((MyShape)vt2.get(i)).draw(g,a,b,Math.abs(re.width-re.x),Math.abs(re.height-re.y));
  }
   
   
int x=(x1<x2)?x1:x2;
  int y=(y1<y2)?y1:y2;
   
  //画出当前选中图形
  ms.draw(g,x,y,Math.abs(x2-x1),Math.abs(y2-y1));//---------------------------Here
   
   
 }
   
//鼠标事件
class ml extends MouseAdapter
{ //鼠标按下
public void mousePressed(MouseEvent e)
{
x1=e.getX();
y1=e.getY();
}

public void mouseReleased(MouseEvent e)
{ //鼠标弹起
Rectangle rea=new Rectangle(x1,y1,x2,y2);
vt.add(rea);
vt2.add(ms);
}
}
//鼠标拖动事件
class nl extends MouseMotionAdapter
{
public void mouseDragged(MouseEvent e)
{
x2=e.getX();
y2=e.getY();
repaint();
}
}
}
///////////////////////////////////////////////////////////////////////////////////
//MainFrame.java 主框架类
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;


class MainFrame extends JFrame
{
 
DrawPanel drawPanel = new DrawPanel();
JButton bt_cls = new JButton("清空");
JButton btnRect,btnCircle;

MainFrame()
{
this.setSize(600,500);
this.setTitle("JAVA制作的画图板");
//=============================西部面板
JPanel pw=new JPanel();
pw.setPreferredSize(new Dimension(120,500));
JPanel pw_1=new JPanel();
pw.add(pw_1);
pw_1.setLayout(new GridLayout(5,2));

//按下矩形按钮时
btnRect =new JButton(new ImageIcon("0.png"));
pw_1.add(btnRect);
btnRect.addActionListener(new m());
//按下圆形按钮时
btnCircle =new JButton(new ImageIcon("1.png"));
pw_1.add(btnCircle);
btnRect.addActionListener(new m());
//按下清除按钮时
pw_1.add(bt_cls);
bt_cls.addActionListener(new m());

this.add(pw,BorderLayout.WEST);
this.add(drawPanel);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
}

class m implements ActionListener
{
public void actionPerformed(ActionEvent e)
{