关于重画的问题 repaint()方法,不要覆盖update(Graphics g)方法 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 vc里面的Invalidate()是置窗口无效,然后自动重画的。java里面的repaint()和他的功能相同。 TO:回复人: kofwr(搭补流二)在MouseDraged中吗?老大,我试过的,没用,但也不报错。 To 各位老大,多谢指导,可是问题还是未能解决。 TO:回复人: fastmask(我心烦) ( ) 信誉:100既然这样,我的程序中根本不要MOVEPAINT,可实际上不要不行。 TO: 回复人: Philip1314(勇敢的心) ( ) 信誉:100 我这样试过,不行的。 TO老大们:以下是我抄谁的代码:运行结果为:拖动矩形,留下所有拖动痕迹。恢复注释部分,拖动矩形看到轨迹,但不会留下痕迹。UPDATE是用来消除闪烁,其实由于图太简单,可以不用。import java.awt.*;import java.awt.event.*;import javax.swing.*;import java.awt.event.MouseListener;import java.awt.event.MouseEvent;import java.io.*;import java.util.*;public class MyGame{ public static void main(String[] args) { JFrame mygame=new MyGameFrame(); mygame.show(); }}class MyGameFrame extends JFrame{ MyPanel MyPanelObject=new MyPanel(); public MyGameFrame() { setTitle("拖动测试·"); setSize(600,400); addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { dispose(); System.exit(0); } }); Container contentPane=getContentPane(); contentPane.add(MyPanelObject); }}class MyPanel extends JPanel implements MouseMotionListener, MouseListener{ public static int curx=10,cury=10,newx,newy; private Point lastPoint; public MyPanel() { addMouseMotionListener(this); addMouseListener(this); } public boolean isFocusTraversable() { return(true); } public void update(Graphics g) { //super.paint(g); //paint(g); } public void paint(Graphics g) { //movepaint(g,curx,cury); g.drawRect(newx,newy,25,25); curx=newx; cury=newy; } private void movepaint(Graphics g,int x,int y) { if(lastPoint==null) return; g.setXORMode(this.getBackground()); g.setColor(Color.black); g.drawRect(x,y,25,25); } public void mouseDragged(MouseEvent e) { //System.out.println("Dragged"); if(binside) { newx = newx + e.getX()-lastPoint.x; newy = newy + e.getY()-lastPoint.y; lastPoint=e.getPoint(); invalidate(); repaint(); } } boolean binside; public void mousePressed(MouseEvent parm1) { if(isInsideObject(parm1.getPoint())) lastPoint=parm1.getPoint(); } private boolean isInsideObject(Point pt) { int cx=newx+25/2; int cy = newy+25/2; int xdif=pt.x-cx; int ydif=pt.y-cy; double fdis=xdif*xdif+ydif*ydif; fdis=Math.sqrt(fdis); if(fdis>25/2) binside= false; else binside=true; return binside; }} 你用了Swing就不用写Update,它本身就是buffer了,你写这些函数都是为了最终的重画,最起码要写在repaint()里面...让后validate,在paint就好了.. to kofwr():Sorry,我弱智,不太明白。是否是说,更改绘图的逻辑运算要放在REPAINT中,然后在MOUSEDRAGGED中先调用validate,再调用Repaint?能否给我改一下以上的例子呢?不要movepaint的。先谢了! 兄弟们,我发觉我是头猪,用一个clearRect()就可以解决问题。给分罗~~~ java 中jdk1.7安装完成后,dos中运行java可以,为什么javac总是不行? Java配置环境变量 求助!关于URLConnection取得输入流问题 @DeclarationNumber(0) 是啥意思? drawImage 有没有办法修改JButton的形状 请帮忙,我在做毕业设计 Vector 的问题,十万火急,在线等! 小服务程序怎样用? 如何写这个SQL 请教高人:一个数据类型转换的问题!!! 如何安装linux下的java编辑环境(急!快来救我。呜呜!!!!!!!!!!!!!)
在MouseDraged中吗?老大,我试过的,没用,但也不报错。
既然这样,我的程序中根本不要MOVEPAINT,可实际上不要不行。
TO: 回复人: Philip1314(勇敢的心) ( ) 信誉:100
我这样试过,不行的。
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.*;public class MyGame
{
public static void main(String[] args)
{
JFrame mygame=new MyGameFrame();
mygame.show();
}
}class MyGameFrame extends JFrame
{
MyPanel MyPanelObject=new MyPanel();
public MyGameFrame()
{
setTitle("拖动测试·");
setSize(600,400);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent e)
{
dispose();
System.exit(0);
}
});
Container contentPane=getContentPane();
contentPane.add(MyPanelObject);
}
}
class MyPanel extends JPanel implements MouseMotionListener, MouseListener
{
public static int curx=10,cury=10,newx,newy;
private Point lastPoint;
public MyPanel()
{ addMouseMotionListener(this);
addMouseListener(this);
}
public boolean isFocusTraversable()
{
return(true);
}
public void update(Graphics g)
{ //super.paint(g);
//paint(g);
}
public void paint(Graphics g)
{
//movepaint(g,curx,cury);
g.drawRect(newx,newy,25,25);
curx=newx;
cury=newy;
}
private void movepaint(Graphics g,int x,int y)
{ if(lastPoint==null)
return;
g.setXORMode(this.getBackground());
g.setColor(Color.black);
g.drawRect(x,y,25,25);
}
public void mouseDragged(MouseEvent e)
{
//System.out.println("Dragged");
if(binside)
{
newx = newx + e.getX()-lastPoint.x;
newy = newy + e.getY()-lastPoint.y;
lastPoint=e.getPoint();
invalidate();
repaint();
}
}
boolean binside;
public void mousePressed(MouseEvent parm1)
{
if(isInsideObject(parm1.getPoint()))
lastPoint=parm1.getPoint();
}
private boolean isInsideObject(Point pt)
{
int cx=newx+25/2;
int cy = newy+25/2;
int xdif=pt.x-cx;
int ydif=pt.y-cy;
double fdis=xdif*xdif+ydif*ydif;
fdis=Math.sqrt(fdis);
if(fdis>25/2)
binside= false;
else
binside=true;
return binside;
}
}
能否给我改一下以上的例子呢?不要movepaint的。先谢了!