拖动与重画 其实可以用另一个思路,比如放入一个Canvas图板,在Canvas上画一个正方形,无须重画它,只须改变Canvas的位置就能够得到拖动的效果了,用到方法setBounds(int x,int y,int width,int height); 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 TO:beyond_xiruo(希偌) 我不是要画矩形,那个程序只是用来示意,我要画一个复杂的图形,这个图形随着每一次鼠标拖动必须重画。我的问题是,每次画新的图都不会消除上一次的图形。 又:我不可以用设XOR MODE 的方法消除上一个图。因为很多的点是交叉的。(用过设XOR MODE 方法的朋友应该知道我的意思) 无论是什么复杂的图形都可以先把它画到一饿canvas上,然后改变它的位置 兄弟们,我发觉我是头猪,用一个clearRect()就可以解决问题。给分罗~~~ 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.*;import java.awt.image.*;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); } private BufferedImage bimg; public void paintComponent(Graphics g) { //movepaint(g,curx,cury);//用来消除上一次的痕迹 super.paintComponent(g); Graphics gimg; if(bimg==null||bimg.getWidth(null)!=this.getWidth()||bimg.getHeight(null)!=this.getHeight()) { bimg=new BufferedImage(this.getWidth( ),this.getHeight(),BufferedImage.TYPE_INT_RGB); gimg = bimg.getGraphics(); } else { gimg = bimg.getGraphics(); gimg.clearRect(0,0,this.getWidth(),this.getHeight()); } paintNoFlick(gimg); gimg.dispose(); g.drawImage(bimg,0,0,this); } private void paintNoFlick(Graphics g) { g.drawRect(newx,newy,25,25); curx=newx; cury=newy; } public void update(Graphics g) { paintComponent(g); } 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(); } } public void mouseClicked(MouseEvent e){} public void mouseReleased(MouseEvent e){} public void mouseEntered(MouseEvent e){} public void mouseExited(MouseEvent e){} public void mouseMoved(MouseEvent e){} 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; }} java 传入oracle 数组出现??? 的乱码问题 正则表达式 怎么做一个去掉窗体边框的界面 关于java多线程.每次运行结果不一样,是否与单/双核有关? java中点击了某一行,就选择了该行 实体类查看器,不需要界面,用控制台实现即可,求思路 登陆控制 问一个简单的不能再简单的numberformat问题 关于final static 和 final 的区别 java socket 服务器 如何用 有限的 线程 来管理 所有 客户端。 请朋友们帮我看看这个程序的问题在那里??谢谢 请教高人:一个数据类型转换的问题!!!
import java.awt.event.*;
import javax.swing.*;
import java.awt.event.MouseListener;
import java.awt.event.MouseEvent;
import java.io.*;
import java.util.*;
import java.awt.image.*;
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);
}
private BufferedImage bimg;
public void paintComponent(Graphics g)
{
//movepaint(g,curx,cury);//用来消除上一次的痕迹
super.paintComponent(g);
Graphics gimg;
if(bimg==null||bimg.getWidth(null)!=this.getWidth()||bimg.getHeight(null)!=this.getHeight())
{
bimg=new BufferedImage(this.getWidth( ),this.getHeight(),BufferedImage.TYPE_INT_RGB);
gimg = bimg.getGraphics();
}
else
{
gimg = bimg.getGraphics();
gimg.clearRect(0,0,this.getWidth(),this.getHeight());
}
paintNoFlick(gimg);
gimg.dispose();
g.drawImage(bimg,0,0,this);
}
private void paintNoFlick(Graphics g)
{
g.drawRect(newx,newy,25,25);
curx=newx;
cury=newy;
}
public void update(Graphics g)
{
paintComponent(g);
}
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();
}
}
public void mouseClicked(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseExited(MouseEvent e){}
public void mouseMoved(MouseEvent e){}
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;
}
}