鼠标监听器界面和绘画

时间:2013-10-25 11:28:57

标签: java swing mouseevent paint bufferedimage

我正在尝试实现图形建模工具。

Graphics modelling

在鼠标单击时,会生成一个红色顶点。将鼠标从一个顶点拖动到另一个顶点时,应绘制一条线。这就是我想要实现的目标。但我的代码没有有效地做到这一点。以下是我的代码和问题

import java.awt.Color;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;

public class NewClass extends JPanel {
    Point source,dest;
    BufferedImage image;
    Graphics2D imageGraphics;
    NewClass(){
    image= new BufferedImage(400,400, BufferedImage.TYPE_INT_ARGB);
    imageGraphics=image.createGraphics();
        this.addMouseListener(new MouseAdapter(){
        @Override
        public void mouseClicked(MouseEvent e){
            if(e.getButton() == MouseEvent.BUTTON1){
                Point p=e.getPoint();
                paintPoint(p);
            }
        }

        @Override
        public void mousePressed(MouseEvent e){
            if(e.getButton() == MouseEvent.BUTTON1){
                source=e.getPoint();
            }
        }
        @Override
        public void mouseReleased(MouseEvent e){
            if(e.getButton() == MouseEvent.BUTTON1){                  
                    dest=e.getPoint();
                    paintLine();
            }
        }    
    });
}
   public void paintPoint(Point r){
    imageGraphics.setColor(Color.red);
    imageGraphics.fillOval(r.x,r.y,5,5);
    repaint();
}
public void paintLine(){
    imageGraphics.setColor(Color.black);
    imageGraphics.drawLine(source.x,source.y,dest.x,dest.y);
    repaint();
}
}

然而,我面临的问题是,当生成mouseClickedEvent时,它也会生成按下和释放。特别是当使用三个以上的顶点时,会生成错误的线。

我希望仅在按下顶点时移动线条,移动到下一个顶点然后在那里释放。

如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

mouseReleased检查发布的位置,如果它与您的source相同,则表示您有点击而不是拖动。您也可以使用此方法完全删除mouseClicked

答案 1 :(得分:1)

您可以简单地覆盖mouseDragged(MouseEvent e),它是为您的使用而设的。