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);
} }
。。。。。以下代码略
展开
 我来答
xy007man
2015-09-06 · TA获得超过1584个赞
知道小有建树答主
回答量:389
采纳率:100%
帮助的人:133万
展开全部
  这需要对鼠标事件有一定的了解,首先实现鼠标按下和抬起两个事件,按下时记录矩形的起始位置,抬起时记录矩形的最终位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。

  另外最重要的部分是实现拖动痕迹的处理,需要实现的的鼠标拖动的事件(具体可以进行判断比如按住左键拖动,右键拖动等),还记得鼠标按下的事件记录的矩形其实位置吧,拖动事件需要记录当前矩形的位置,两个坐标值相减,得到矩形的高度和宽度即可最终确定一个矩形,画出来。
  问题就来了,那就是有两个矩形了,这时在鼠标抬起的事件中删除一个拖动痕迹的矩形。
2fefzd
2012-10-30 · 超过15用户采纳过TA的回答
知道答主
回答量:76
采纳率:0%
帮助的人:52.4万
展开全部
别放到拖拽事件里,这样当然一直画线,可以将事件放到点击里,判断是第二次点击的时候在画线不就可以画出一个方块了吗
追问
这样就看不到拖动的时候那个线条变化效果了。。而是直接出来一个矩形
追答
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);
}
}
}

你试试!
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
百度网友12ee0fd
2015-08-22 · TA获得超过4.7万个赞
知道大有可为答主
回答量:1.1万
采纳率:66%
帮助的人:1955万
展开全部

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();
            }
        }
    }
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
易建议
2015-08-25 · 喜欢分享的人都容易获得幸福感~
易建议
采纳数:344 获赞数:1342

向TA提问 私信TA
展开全部
试试面板重绘。你这是因为拖动后没有重绘,才会导致保留之间的哼唧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
flymomo123
2012-10-30 · TA获得超过819个赞
知道小有建树答主
回答量:301
采纳率:0%
帮助的人:370万
展开全部
每次画矩形之前先画背景。。

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);
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(5)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式