java中鼠标拖动画矩形怎么消除拖动的痕迹,最后只得到一个矩形框
importjava.awt.*;importjavax.swing.*;importjava.awt.event.*;classMyCanvasextendsCanva...
import java.awt.*;
import javax.swing.*;
import java.awt.event.*;
class MyCanvas extends Canvas{
int orgX,orgY,curX,curY;
class MouseHandle extends MouseAdapter{
public void mousePressed(MouseEvent me){
orgX=me.getX();
orgY=me.getY();
} }
class MouseMotionHandle extends MouseMotionAdapter{
public void mouseDragged(MouseEvent me){
curX=me.getX();
curY=me.getY();
Graphics g=getGraphics();
g.drawLine(orgX,orgY, curX, orgY);
g.drawLine(orgX, orgY, orgX, curY);
g.drawLine(orgX, curY, curX, curY);
g.drawLine(curX, orgY, curX, curY);
} }
。。。。。以下代码略 展开
import javax.swing.*;
import java.awt.event.*;
class MyCanvas extends Canvas{
int orgX,orgY,curX,curY;
class MouseHandle extends MouseAdapter{
public void mousePressed(MouseEvent me){
orgX=me.getX();
orgY=me.getY();
} }
class MouseMotionHandle extends MouseMotionAdapter{
public void mouseDragged(MouseEvent me){
curX=me.getX();
curY=me.getY();
Graphics g=getGraphics();
g.drawLine(orgX,orgY, curX, orgY);
g.drawLine(orgX, orgY, orgX, curY);
g.drawLine(orgX, curY, curX, curY);
g.drawLine(curX, orgY, curX, curY);
} }
。。。。。以下代码略 展开
展开全部
这需要对鼠标事件有一定的了解,首先实现鼠标按下和抬起两个事件,按下时记录矩形的起始位置,抬起时记录矩形的最终位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
另外最重要的部分是实现拖动痕迹的处理,需要实现的的鼠标拖动的事件(具体可以进行判断比如按住左键拖动,右键拖动等),还记得鼠标按下的事件记录的矩形其实位置吧,拖动事件需要记录当前矩形的位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
问题就来了,那就是有两个矩形了,这时在鼠标抬起的事件中删除一个拖动痕迹的矩形。
另外最重要的部分是实现拖动痕迹的处理,需要实现的的鼠标拖动的事件(具体可以进行判断比如按住左键拖动,右键拖动等),还记得鼠标按下的事件记录的矩形其实位置吧,拖动事件需要记录当前矩形的位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
问题就来了,那就是有两个矩形了,这时在鼠标抬起的事件中删除一个拖动痕迹的矩形。
展开全部
别放到拖拽事件里,这样当然一直画线,可以将事件放到点击里,判断是第二次点击的时候在画线不就可以画出一个方块了吗
追问
这样就看不到拖动的时候那个线条变化效果了。。而是直接出来一个矩形
追答
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class test {
public static void main(String[] args) {
new fm();
}
}
class fm extends JFrame {
int orgx, orgy, endx, endy;
Image oimage = null;
Graphics gr = null;
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
public fm() {
setVisible(true);
setSize(500, 300);
getGraphics().clearRect(0, 0, 500, 300);
oimage = createImage(d.width, d.height);
gr = oimage.getGraphics();
this.addMouseListener(new MouseAdapter() {
public void mousePressed(MouseEvent e) {
orgx = e.getX();
orgy = e.getY();
}
public void mouseReleased(MouseEvent e) {
System.out.println("...");
}
public void mouseDragged(MouseEvent e) {
}
});
this.addMouseMotionListener(new MouseMotionAdapter() {
public void mouseDragged(MouseEvent e) {
endx = e.getX();
endy = e.getY();
Graphics g = getGraphics();
g.clearRect(0, 0, 500, 300);
g.setColor(Color.BLUE);
g.drawRect(orgx, orgy, endx - orgx, endy - orgy);
}
});
}
public void paint(Graphics g) {
if (gr != null) {
g.drawImage(oimage, 0, 0, this);
}
}
}
你试试!
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
1 继承Swing中的JPanel,而不是AWT中的Canvas。因为JPanel默认启用了双缓冲。
2 重写paintComponent方法而不是paint方法。绘制前需要清空画布,重写paintComponent方法时在开头调用父类的方法清空画布。
super.paintComponent(g);
public class MouseDragingExample {
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
JFrame frame = new JFrame("Example");
frame.add(new PainterPane());
frame.pack();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
});
}
static final class PainterPane extends JPanel {
/**
*
*/
private static final long serialVersionUID = -7281332353965961554L;
private int x;
private int y;
private int width;
private int height;
public PainterPane() {
setPreferredSize(new Dimension(800, 600));
MouseAdapter handle = new MouseHandle();
addMouseListener(handle);
addMouseMotionListener(handle);
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g;
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
g2d.drawRect(x, y, width, height);
}
public class MouseHandle extends MouseAdapter {
@Override
public void mouseDragged(MouseEvent evt) {
width = evt.getX() - x;
height = evt.getY() - y;
repaint();
}
@Override
public void mousePressed(MouseEvent evt) {
x = evt.getX();
y = evt.getY();
}
@Override
public void mouseReleased(MouseEvent evt) {
width = evt.getX() - x;
height = evt.getY() - y;
repaint();
}
}
}
}
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
试试面板重绘。你这是因为拖动后没有重绘,才会导致保留之间的哼唧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
每次画矩形之前先画背景。。
Graphics g=getGraphics();
//这里加个背景色的全屏矩形 g.fillRect(arg0, arg1, arg2, arg3)注意颜色 坐标要合乎全屏
g.drawLine(orgX,orgY, curX, orgY);
g.drawLine(orgX, orgY, orgX, curY);
g.drawLine(orgX, curY, curX, curY);
g.drawLine(curX, orgY, curX, curY);
Graphics g=getGraphics();
//这里加个背景色的全屏矩形 g.fillRect(arg0, arg1, arg2, arg3)注意颜色 坐标要合乎全屏
g.drawLine(orgX,orgY, curX, orgY);
g.drawLine(orgX, orgY, orgX, curY);
g.drawLine(orgX, curY, curX, curY);
g.drawLine(curX, orgY, curX, curY);
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询