当前位置: 技术问答>java相关
拖动与重画
来源: 互联网 发布时间:2015-10-27
本文导语: 我要做一个应用, 以下是我抄谁的代码:运行结果为:拖动矩形,留下所有拖动痕迹。恢复注释部分,拖动矩形看到轨迹,但不会留下痕迹。 现在的问题是:我不想自己编movepaint();即擦除所有原有图形的函数。因为...
我要做一个应用,
以下是我抄谁的代码:运行结果为:拖动矩形,留下所有拖动痕迹。恢复注释部分,拖动矩形看到轨迹,但不会留下痕迹。
现在的问题是:我不想自己编movepaint();即擦除所有原有图形的函数。因为这个函数很复杂。但如果没有movepaint();在拖动中一定会留下拖动痕迹。按理说,repaint()函数会自动清屏,可在鼠标拖动的事件中,它就是不会清屏。
麻烦哪位老大改一下以下的程序,不用movepaint();达到拖动的效果。
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 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();即擦除所有原有图形的函数。因为这个函数很复杂。但如果没有movepaint();在拖动中一定会留下拖动痕迹。按理说,repaint()函数会自动清屏,可在鼠标拖动的事件中,它就是不会清屏。
麻烦哪位老大改一下以下的程序,不用movepaint();达到拖动的效果。
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 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;
}
}
|
其实可以用另一个思路,比如放入一个Canvas图板,在Canvas上画一个正方形,无须重画它,只须改变Canvas的位置就能够得到拖动的效果了,用到方法
setBounds(int x,int y,int width,int height);
setBounds(int x,int y,int width,int height);
|
up
|
被楼主搞糊涂了……
|
rui
您可能感兴趣的文章:
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。