解决方法:
在Applet上add一个canvas,然后在canvas上画线.
可以新建一个extends Canvas 类的class,重构paint方法,在paint方法里面实现画直线方法和过程.
当鼠标拉动的时候,要把先前画的直线擦掉,把新的直线画上去.
一下是一个示范代码(我同学写的):
package HelloWorld;import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
import javax.swing.border.*;
import java.awt.geom.*;
import java.util.Vector;
/**
 * <p>Title: </p>
 * <p>Description: </p>
 * <p>Copyright: Copyright (c) 2003</p>
 * <p>Company: </p>
 * @author unascribed
 * @version 1.0
 */public class TLine extends JFrame {  TLinesCanvas canvas;
  public TLine()
  {
    Container container=getContentPane();
    canvas=new TLinesCanvas();
    container.add(canvas);
    pack();
    show();
  }  public static void main(String args[])
  {
    new TLine();
  }  class TLinesCanvas extends Canvas
  {
    Vector Lines=new Vector();
    Line2D currentLine;
    Point2D start=new Point2D.Float();
    Point2D pretempend=new Point2D.Float();
    Point2D tempend=new Point2D.Float();
    Point2D end=new Point2D.Float();
    boolean isEnd;
    public TLinesCanvas()
    {
      setBackground(Color.white);
      setSize(400,250);
      addMouseListener(new LinesListener());
      addMouseMotionListener(new LineMouseMotionListener());
    }    public void paint(Graphics g)
    {
      Graphics2D g2D=(Graphics2D)g;
      if(isEnd==false)
      {
        g2D.drawLine((int)start.getX(),(int)start.getY(),(int)tempend.getX(),(int)tempend.getY());
      }
      else
      {
        g2D.drawLine((int)start.getX(),(int)start.getY(),(int)end.getX(),(int)end.getY());
      }      for(int i=0;i<Lines.size();i++)
      {
        Line2D iLine=(Line2D)Lines.elementAt(i);
        g2D.drawLine((int)iLine.getX1(),(int)iLine.getY1(),(int)iLine.getX2(),(int)iLine.getY2());
      }
    }    class LinesListener extends MouseAdapter
    {
      public void mousePressed(MouseEvent e)
      {
        start.setLocation(e.getPoint());
        isEnd=false;
      }      public void mouseReleased(MouseEvent e)
      {
        end.setLocation(e.getPoint());
        isEnd=true;
        currentLine=new Line2D.Float(start,end);
        Lines.addElement(currentLine);
        repaint();
      }
    }    class LineMouseMotionListener implements MouseMotionListener
    {
      public void mouseDragged(MouseEvent e)
      {
        tempend.setLocation(e.getPoint());
        repaint();
      }      public void mouseMoved(MouseEvent e)
      {
      }
    }
  }
}
程序存在的问题:画直线过程中,canvas会闪烁.原因是:每次拉动鼠标时,Vector对象把所有直线重画一次.
至今还没能解决问题.

解决方案 »

  1.   

    已测试
    import java.applet.*;
    import java.awt.*;
    import java.awt.event.*;
    public class appletDrawLine extends Applet{
    boolean isMouseDown=false;
    int x1=0;
    int y1=0;
    int x2=0;
    int y2=0;
    public void init(){
    setLayout(new BorderLayout());
    addMouseListener(new DisposalMouse());
    addMouseMotionListener(new DisposalMouseMotion());
    setSize(300,300);
    setVisible(true);
    }
    public void paint(Graphics g){
            g.drawLine(x1,y1,x2,y2);
    }
    //用来处理鼠标事件
    class DisposalMouse extends MouseAdapter{
         public void mousePressed(MouseEvent e){
         isMouseDown=true;
         x1=e.getX();
         y1=e.getY();
         }
         public void mouseReleased(MouseEvent e){
        isMouseDown=false;
         }    }
        class DisposalMouseMotion extends MouseMotionAdapter{
         public void mouseDragged(MouseEvent e){
         if(isMouseDown==true){
            x2=e.getX();
         y2=e.getY();
         repaint();
        }
        }
        }
    }
      

  2.   

    <HTML>
    <APPLET CODE="appletDrawLine.class" WIDTH="300" HEIGHT="300">
    </APPLET>
    </HTML>
    在html里面
    却说找不到class
    我已经放在一个目录下面了
      

  3.   

    <HTML>
    <HEAD>
    <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
    </HEAD>
    <BODY><P>&nbsp;</P>
    <!-- Insert HTML here -->
    <applet
    code=Applet1.class
    name=Applet1
    width=320
    height=200  VIEWASTEXT>
    <param name=label value="This string was passed from the HTML host.">
    <param name=background value="008080">
    <param name=foreground value="FFFFFF">
    </applet></BODY>
    </HTML>
    测试过了,
    在同一目录下,
    如果你装了VJ++6.0,就没有问题。