解决方法:
在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对象把所有直线重画一次.
至今还没能解决问题.
在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对象把所有直线重画一次.
至今还没能解决问题.
解决方案 »
- 求个Java采集类
- 请教如何在java中实现正态分布图效果,有没有可供使用的第三方组件?
- 一个窗口的事件监听函数里如何更新另外一个窗口类的变量
- 想换程序学习的网友请进。
- java 基础题求解!在线等待!
- 请问一下,如何在一个区域中画刨面线??
- jbuilder7生成SOLARIS可下运行的文件,但在SOLARIS下运行失败!
- Exception in thread "main" java.lang.NoClassDefFoundError :~~ 。怎么解决?
- java有模态窗口吗?
- 哪位高手有兴趣跟我讨论讨论java中调用dll文件??小弟有些问题还是不很清楚??
- 在java中提取系统时间
- 高分求内部类的问题
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();
}
}
}
}
<APPLET CODE="appletDrawLine.class" WIDTH="300" HEIGHT="300">
</APPLET>
</HTML>
在html里面
却说找不到class
我已经放在一个目录下面了
<HEAD>
<META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
</HEAD>
<BODY><P> </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,就没有问题。