当前位置: 首页 > 面试题库 >

每次单击鼠标都画一条线,双击时停止绘制

方鸿振
2023-03-14
问题内容

我必须在鼠标移动时画线,单击鼠标后,应该继续画线,直到双击为止。说点A,点B和点C。在点A上单击鼠标时,应开始画线。当在B点上单击鼠标时,除非双击,否则上一条线应该与新线一起从B点开始绘制。C点应相同,依此类推,直到双击鼠标为止。经过研究,我编写了下面的代码,它工作得很好,但是它可以用于拖动NOT
MOUSE MOVE事件,我试图将代码转移到mouseMoved事件,但是上一行消失了。有人可以帮我解决这个问题吗?

public class WorkingLines {
    public WorkingLines() {
        JFrame jf = new JFrame("Free Hand Drawing Example");

        Board draw = new Board();
        jf.add(draw);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(600, 500);
        jf.setVisible(true);
    }

    public static void main(String a[]) {
        new WorkingLines();
    }
}

class Board extends JPanel implements MouseListener, MouseMotionListener {
    ArrayList<pts> list = new ArrayList<pts>();
    Point start, end;

    public Board() {
        start = null; /* Initializing */
        end = null;

        // this.setBackground(Color.BLACK);
        this.addMouseListener(this);
        this.addMouseMotionListener(this);
    }

    @Override
    public void paint(Graphics g) {
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        super.paint(g2);
        // g.setColor(Color.BLACK);
        for (pts p : list) {
            System.out.println("Drawing Lines!!!=>");
            g.drawLine((int) p.getStart().getX(), (int) p.getStart().getY(), (int) p.getEnd().getX(),
                    (int) p.getEnd().getY());
        }

        if (start != null && end != null) {
            System.out.println("Drawing happening!!!=>");
            g.drawLine(start.x, start.y, end.x, end.y);
        }
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
    }

    @Override
    public void mouseExited(MouseEvent arg0) {
    }

    @Override
    public void mousePressed(MouseEvent me) {
        start = me.getPoint();
        System.out.println("Start initialized!!");
        for (pts pt : list) {
            System.out.println("Point x coordinate =>" + pt.start.getX());
        }
        repaint();
    }

    @Override
    public void mouseReleased(MouseEvent me) {
        end = me.getPoint();
        pts pt = new pts(start, end);
        list.add(pt);
        repaint();

        if (me.getClickCount() == 2) {
            start = null;
            end = null;
        }

    }

    @Override
    public void mouseDragged(MouseEvent me) {
        System.out.println("Mouse Moved=>" + start);
        end = me.getPoint();
        repaint();
    }

    @Override
    public void mouseMoved(MouseEvent me) {

    }
}

class pts {

    Point start = null;
    Point end = null;

    public pts(Point start, Point end) {
        this.start = start;
        this.end = end;
    }

    public Point getStart() {
        return this.start;
    }

    public Point getEnd() {
        return this.end;
    }

}

问题答案:

注意添加的标志:

import java.awt.BasicStroke;
import java.awt.BorderLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Label;
import java.awt.Point;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.util.ArrayList; 
import javax.swing.JFrame;
import javax.swing.JPanel;

public class WorkingLines {

    public WorkingLines() {

        JFrame jf = new JFrame("Free Hand Drawing Example");
        JPanel draw = new DrawBoard();
        jf.add(new Label("Click....move mouse, click again"), BorderLayout.NORTH);
        jf.add(draw);
        jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jf.setSize(600, 500);
        jf.setVisible(true);
    }

    public static void main(String a[]) {
        new WorkingLines();
    }
}

class DrawBoard extends JPanel implements MouseListener, MouseMotionListener {
    ArrayList<pts> list = new ArrayList<>();
    Point start, end;
    private boolean isDrawing = false; //a flag

    public DrawBoard() {
        start = null;  end = null; /* Initializing */
        addMouseListener(this);
        addMouseMotionListener(this);
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        g2.setStroke(new BasicStroke(3, BasicStroke.CAP_ROUND, BasicStroke.JOIN_ROUND));
        super.paintComponent(g2);

        for (pts p : list) {
            g.drawLine((int) p.getStart().getX(), (int) p.getStart().getY(), (int) p.getEnd().getX(),
                    (int) p.getEnd().getY());
        }

        if ((start != null) && (end != null)) {
            g.drawLine(start.x, start.y, end.x, end.y);
        }
    }

    @Override
    public void mouseClicked(MouseEvent arg0) {}

    @Override
    public void mouseEntered(MouseEvent arg0) {}

    @Override
    public void mouseExited(MouseEvent arg0) {}

    @Override
    public void mousePressed(MouseEvent me) {

        if(! isDrawing) {

            start = me.getPoint();
            isDrawing = ! isDrawing;
        }else {

            pts pt = new pts(start, end);
            list.add(pt);
            start = end;
        }
    }

    @Override
    public void mouseReleased(MouseEvent me) {

        if (me.getClickCount() == 2) {
            start = null;
            end = null;
            isDrawing = false;
        }
    }

    @Override
    public void mouseDragged(MouseEvent me) {}

    @Override
    public void mouseMoved(MouseEvent me) {
            end = me.getPoint();
            repaint();
    }
}

class pts {

    Point start = null, end = null;

    public pts(Point start, Point end) {
        this.start = start;
        this.end = end;
    }

    public Point getStart() { return start;   }

    public Point getEnd() {  return end;  }
}


 类似资料:
  • 考虑一个,下面是它的 双击后,我得到了以下令人费解的结果 而不是预期的 显然,在双击过程中,在所述双击之前单击一次。为什么会这样? rough.java Env: openjdk 15.0.2 2021-01-19 openjdk运行时环境(构建15.0.2 7-27) openjdk 64位服务器虚拟机(构建15.0.2 7-27,混合模式,共享) Windows 10

  • 我正在尝试创建一个程序,该程序应该基于两次鼠标左键单击在画布上绘制一个矩形,并通过一次右键单击清除画布。 创建矩形的方式应该是,第一次鼠标点击模拟矩形的一个角,下一次鼠标点击与第一次鼠标点击相比模拟矩形的对角线角。 我被困在如何存储第一次鼠标点击的坐标,然后把第二次鼠标点击用好,因为每个定义的矩形只基于一组坐标创建,这是矩形的左上角。 现在,我的代码所做的只是绘制固定大小的矩形(50x25),这显

  • 问题内容: 我只想在鼠标单击后绘制圆圈。由于paintComponent方法调用了自身,因此首先绘制圆而无需单击。 问题答案: 您的代码存在一些问题: 你永远不会打电话 你只需要一个和 请注意,当您调整框架大小时,某些圆圈将消失,并且总体上以奇怪的方式表现。 我会将所有s 存储在用户单击的位置,然后在方法内部遍历该列表。这样您就可以通话,而圈子不会消失。 更改后的工作代码:

  • 问题内容: 如标题所示,我很难在JApplet中绘制一些矩形(填充的)。确切的目标是拥有一张50x50的表格,并在您 点击目标单元格时将其填充(可以通过绘制一个填充的矩形来完成)。我已经完成了有关起点坐标的数学运算, 但是由于某些原因,我无法在MouseClicked方法中绘制新矩形。有什么建议? 问题答案: 这是一个相对简单的概念(没有冒犯性)。 首先,请勿将代码与JApplet和混合使用JFr

  • 好的,所以我要试着解释一下,我在一个包含我的蓝贝和所有构造函数的类中创建了一个射击方法,问题是当我按下空间时,它会不断地射击,而我不会再按下它,如果我按下它两倍的速度,它会以两倍的速度发射,并且它开始在我的网格上包含多个x和y位置我只希望法术在发射时发射,我只需要一个项目,因为我不想在网格上有多个它的实例我希望它是玩家在法术离开网格之前不能发射,这是我的代码,谢谢我只有它调用我的密钥释放看到它应该

  • 问题内容: 我需要一个JavaScript代码来单独使鼠标双击。我将在Java代码中使用它。这是一个用于测试目的的selenium项目,但是没有任何方法可以使鼠标双击selenium,因此我想使用javaScript在我的java代码中执行此操作。你有什么主意吗? 他们说我应该使用JavaScript双击鼠标,但是怎么做? 问题答案: 为了使 您可以编写脚本并将其传递给方法,如下所示: 剧本: “