歪脚鸭java学习之经典旅程————————————第二问 1.CanvasDraw中没有paint()方法呀,把的源码贴上来我帮你改2.缓冲的缘故 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 import java.applet.*;import java.awt.*;import java.awt.event.*;public class TestCanvas extends Applet{ CanvasDraw cd; public void init() { cd=new CanvasDraw(new Dimension(200,180),this); cd.setBackground(Color.pink); add(cd); cd.requestFocus(); }}class CanvasDraw extends Canvas implements KeyListener{ Applet m_Parent; //包含画布的Applet对象引用 boolean m_bFlag=false; //是否用鼠标画线 int currentX=0,currentY=0; //当前鼠标位置 int startX=0,startY=0; //直线的开始坐标 StringBuffer sb=new StringBuffer(); //保存用户键盘输入的字符 CanvasDraw(Dimension d,Applet p) //构造函数 { m_Parent=p; setSize(d); setBackground(Color.gray); addKeyListener(this); addMouseListener(new MouseAdpt(this)); addMouseMotionListener(new MouseMotionAdpt(this)); } void setStart(int x,int y) //设定直线的开始坐标 { startX=x; startY=y; } void setCurrent(int x,int y) //设定当前鼠标位置 { currentX=x; currentY=y; } void setMouseDragged(boolean b) //设定鼠标拖动状态 { m_bFlag=b; } void showMeg(String s) //显示状态行 { m_Parent.showStatus(s); } void clearAll() //复位 { startX=0; startY=0; currentX=0; currentY=0; repaint(); } public void keyTyped(KeyEvent e) //按键敲击事件 { char ch=e.getKeyChar(); sb.append(ch); showMeg("击键"+sb.toString()); repaint(); } public void keyPressed(KeyEvent e){}// public void keyReleased(KeyEvent e){} public void paint(Graphics g) { g.drawString("("+currentX+","+currentY+")"+sb,10,20); if(m_bFlag) g.drawLine(startX,startY,currentX,currentY); //画线 this.requestFocus(); }}class MouseAdpt extends MouseAdapter //从鼠标监听事件裁剪类派生{ CanvasDraw m_Parent; MouseAdpt(CanvasDraw p) //构造函数 { m_Parent=p; } public void mousePressed(MouseEvent e) { m_Parent.setStart(e.getX(),e.getY()); //设定直线的开始坐标 // m_Parent.setMouseDragged(true); m_Parent.showMeg("您开始划线"); } public void mouseReleased(MouseEvent e) { m_Parent.setCurrent(e.getX(),e.getY()); // m_Parent.repaint(); // m_Parent.setMouseDragged(false); // m_Parent.repaint(); m_Parent.showMeg("您画出了一条直线"); } public void mouseEntered(MouseEvent e) { m_Parent.showMeg("鼠标进入画布"); } public void mouseExited(MouseEvent e) { m_Parent.showMeg("鼠标移出画布"); }}class MouseMotionAdpt extends MouseMotionAdapter //从鼠标动作监听事件裁剪类派生{ CanvasDraw m_Parent; MouseMotionAdpt(CanvasDraw p) //构造函数 { m_Parent=p; } public void mouseMoved(MouseEvent e) { m_Parent.setCurrent(e.getX(),e.getY()); m_Parent.setMouseDragged(false); m_Parent.repaint(10,0,60,30); } public void mouseDragged(MouseEvent e) { m_Parent.setCurrent(e.getX(),e.getY()); m_Parent.setMouseDragged(true); m_Parent.repaint(); }} paint()方法是Container类的方法啊你的m_Parent没有继承Container啊IE有Applet的缓冲,所以.... 顺便一说,用Swing吧很多时候paint(),update()对重量级的组件是无效的:) 重载update函数就可以了。把刷新背景这个操作去掉。 重载update()好使吗? 不见得。我 建议你把所有的操作都执行到一个缓冲的画布上,然后调用pant()把画布写到屏幕,而不是直接写屏。 第二个问题已经有了答案。 不好意思“paint()方法是Container类的方法啊,你的m_Parent没有继承Container啊”完全是胡说八道了嗯,如果你只是想不清除画布,只要这样就可以了public void update(Graphics g){ paint(g);}加入CanvasDraw类的定义中。但是可能不会有你想看到的那种效果了,你试一试吧 什么叫快速失败? 用UDP协议实现文件传输 百度的一个算法面试题 public是默认值吗? 关于JFrame的播放声音文件的问题,急急急急!!! 怎么在多线程中使用代理的问题 如何上传本地文件 请问java中如何进行位运算??? 照抄书上代码报错: 不是抽象的,并且未覆盖 java.awt.event.KeyListener 中的抽象方法KeyReleased 向oracle9i中插入BLOB时出现问题,请教各位。 很简单,100分求助JCheckBox的问题 关于如何使用package的简单问题
import java.awt.*;
import java.awt.event.*;public class TestCanvas extends Applet
{
CanvasDraw cd; public void init()
{
cd=new CanvasDraw(new Dimension(200,180),this);
cd.setBackground(Color.pink);
add(cd);
cd.requestFocus();
}
}class CanvasDraw extends Canvas implements KeyListener
{
Applet m_Parent; //包含画布的Applet对象引用
boolean m_bFlag=false; //是否用鼠标画线
int currentX=0,currentY=0; //当前鼠标位置
int startX=0,startY=0; //直线的开始坐标
StringBuffer sb=new StringBuffer(); //保存用户键盘输入的字符 CanvasDraw(Dimension d,Applet p) //构造函数
{
m_Parent=p;
setSize(d);
setBackground(Color.gray);
addKeyListener(this);
addMouseListener(new MouseAdpt(this));
addMouseMotionListener(new MouseMotionAdpt(this));
}
void setStart(int x,int y) //设定直线的开始坐标
{
startX=x;
startY=y;
}
void setCurrent(int x,int y) //设定当前鼠标位置
{
currentX=x;
currentY=y;
}
void setMouseDragged(boolean b) //设定鼠标拖动状态
{
m_bFlag=b;
}
void showMeg(String s) //显示状态行
{
m_Parent.showStatus(s);
}
void clearAll() //复位
{
startX=0;
startY=0;
currentX=0;
currentY=0;
repaint();
}
public void keyTyped(KeyEvent e) //按键敲击事件
{
char ch=e.getKeyChar();
sb.append(ch);
showMeg("击键"+sb.toString());
repaint();
}
public void keyPressed(KeyEvent e){}
// public void keyReleased(KeyEvent e){}
public void paint(Graphics g)
{
g.drawString("("+currentX+","+currentY+")"+sb,10,20);
if(m_bFlag)
g.drawLine(startX,startY,currentX,currentY); //画线
this.requestFocus();
}
}class MouseAdpt extends MouseAdapter //从鼠标监听事件裁剪类派生
{
CanvasDraw m_Parent;
MouseAdpt(CanvasDraw p) //构造函数
{
m_Parent=p;
}
public void mousePressed(MouseEvent e)
{
m_Parent.setStart(e.getX(),e.getY()); //设定直线的开始坐标
// m_Parent.setMouseDragged(true);
m_Parent.showMeg("您开始划线");
}
public void mouseReleased(MouseEvent e)
{
m_Parent.setCurrent(e.getX(),e.getY());
// m_Parent.repaint();
// m_Parent.setMouseDragged(false);
// m_Parent.repaint();
m_Parent.showMeg("您画出了一条直线");
}
public void mouseEntered(MouseEvent e)
{
m_Parent.showMeg("鼠标进入画布");
}
public void mouseExited(MouseEvent e)
{
m_Parent.showMeg("鼠标移出画布");
}
}class MouseMotionAdpt extends MouseMotionAdapter //从鼠标动作监听事件裁剪类派生
{
CanvasDraw m_Parent;
MouseMotionAdpt(CanvasDraw p) //构造函数
{
m_Parent=p;
}
public void mouseMoved(MouseEvent e)
{
m_Parent.setCurrent(e.getX(),e.getY());
m_Parent.setMouseDragged(false);
m_Parent.repaint(10,0,60,30);
}
public void mouseDragged(MouseEvent e)
{
m_Parent.setCurrent(e.getX(),e.getY());
m_Parent.setMouseDragged(true);
m_Parent.repaint();
}
}
你的m_Parent没有继承Container啊IE有Applet的缓冲,所以....
很多时候paint(),update()对重量级的组件是无效的:)
把刷新背景这个操作去掉。
“paint()方法是Container类的方法啊,你的m_Parent没有继承Container啊”
完全是胡说八道了嗯,如果你只是想不清除画布,只要这样就可以了
public void update(Graphics g){
paint(g);
}加入CanvasDraw类的定义中。但是可能不会有你想看到的那种效果了,你试一试吧