//MouseDraw.javaimport java.awt.*;
import java.awt.event.*;public class MouseDraw
{
public static void main(String[] args)

MouseFrame frame=new MouseFrame();
frame.addWindowListener(new Wadapt());
frame.setVisible(true);
}
}class MouseFrame extends Frame
{
public MouseFrame()
{
setTitle("利用鼠标绘图");
setSize(300,300);
//将panel加入到frame
MousePanel panel=new MousePanel();
add(panel);
}
}class MousePanel extends Panel implements MouseListener,MouseMotionListener
{
private int x,y,start_X,start_Y,old_X,old_Y;
private boolean draw;
public MousePanel()
{
addMouseListener(this);
addMouseMotionListener(this);
}public void mousePressed(MouseEvent evt)
{
start_X=evt.getX();
start_Y=evt.getY();
draw=false;
}
public void mouseReleased(MouseEvent evt){}public void mouseClicked(MouseEvent evt){}public void mouseEntered(MouseEvent evt)
{
setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
}public void mouseExited(MouseEvent evt)
{
setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
}public void mouseDragged(MouseEvent evt)
{
x=evt.getX();
y=evt.getY();
repaint(); 
}public void mouseMoved(MouseEvent evt){}public void update(Graphics g)
{
paint(g);
}public void paint(Graphics g)
{
if(!draw)
{
old_X=x;
old_Y=y;
draw=true;
}
else
{
g.setColor(getBackground());
g.drawLine(start_X,start_Y,old_X,old_Y);
old_X=x;
old_Y=y;
}
g.setColor(getForeground());
g.drawLine(start_X,start_Y,x,y);
}
}class Wadapt extends WindowAdapter
{
public void windowClosing(WindowEvent evt)
{
Frame frm=(Frame)evt.getSource();
frm.setVisible(false);
frm.dispose();
System.exit(0);
}
}
修改程序中的MouseDraw.java源文件,使其克服以下缺陷:
1. 当鼠标在绘图区域单击时,可用黑色圆点实时显示光标当前位置。
2. 当绘制的两条线段交叉时,不会因为一条线段的移动而导致另一条线段被擦除。
3. 所有绘制工作完成后,当对绘图窗口执行以下几种操作时,不会导致原有绘制好的线段丢失。
(1) 改变绘图窗口大小
(2) 最小化绘图窗口后再恢复成窗口大小
(3) 用其他窗口全部或部分覆盖绘图窗口,然后再露出绘图窗口

解决方案 »

  1.   

    楼主,这是用vc绘图的经典问题除了第一个问题使用Cursor.getPredefinedCursor(*));
    解决外,其余的都必须用数组记录每条直线的起终点,当界面要validateUI时就重画数组中的所有直线.
      

  2.   

    将你源文件中一些不必要的类整合了一下,实现了你要的功能。
    //MouseDraw.javaimport java.awt.*;
    import java.awt.event.*;
    import java.util.*;public class MouseDraw extends Frame
    {
    public MouseDraw()
    {
    setTitle("利用鼠标绘图");
    setSize(300,300);
    //将panel加入到frame
    MousePanel panel=new MousePanel();
    add(panel);
    }

    public static void main(String[] args)

    MouseDraw frame = new MouseDraw();
    frame.addWindowListener(
    new WindowAdapter()
    {
    public void windowClosing(WindowEvent e)
    {
    System.exit(0);
    }
    });
    frame.setVisible(true);
    }
    }

    class MousePanel extends Panel implements MouseListener,MouseMotionListener
    {
    private int x,y,start_X,start_Y,old_X,old_Y;
    private Vector v = new Vector();
    private boolean draw = false;
    private boolean click = false;

    public MousePanel()
    {
    addMouseListener(this);
    addMouseMotionListener(this);
    }

    public void mousePressed(MouseEvent evt)
    {
    start_X = old_X = evt.getX();
    start_Y = old_Y = evt.getY();
    draw = false;
    }
    public void mouseReleased(MouseEvent evt)
    {
    if (draw)
    {
    int[] line = {start_X, start_Y, x, y};
    v.add(line);
    }
    }

    public void mouseClicked(MouseEvent evt)
    {
    start_X = evt.getX();
    start_Y = evt.getY();
    click = true;
    int[] round = {start_X, start_Y};
    v.add(round);
    repaint();
    }

    public void mouseEntered(MouseEvent evt)
    {
    setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR));
    }

    public void mouseExited(MouseEvent evt)
    {
    setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
    }

    public void mouseDragged(MouseEvent evt)
    {
    x=evt.getX();
    y=evt.getY();
    draw = true;
    repaint();
    }

    public void mouseMoved(MouseEvent evt){}

    public void update(Graphics g)
    {
    paint(g);
    }

    public void paint(Graphics g)
    {
    if (click)
    {
    g.setColor(getForeground());
    g.fillOval(start_X,start_Y,2,2);
    click = false;
    }
    if (draw)
    {
    g.setColor(getBackground());
    g.drawLine(start_X,start_Y,old_X,old_Y);
    g.setColor(getForeground());
    g.drawLine(start_X,start_Y,x,y);
    old_X=x;
    old_Y=y;
    }
    Iterator i = v.iterator();
    while (i.hasNext())
    {
    int[] figure = (int[]) i.next();
    if (figure.length ==4)
    g.drawLine(figure[0], figure[1], figure[2], figure[3]);
    if (figure.length ==2)
    g.fillOval(figure[0], figure[1], 2, 2);
    }
    }
    }