java 使用鼠标事件徒手画线

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/6039831/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-10-30 14:04:40  来源:igfitidea点击:

freehand drawline using mouse events

javaswing

提问by sutoL

may i know if there is any formula for drawing lines? currently i am implementing a freehand draw line in java, however the code below when drawn it is not what im expecting. i have tried g.drawLine(arg0.getX(), arg0.getY(), arg0.getX(), arg0.getY()); , however the line drawn is not continous rather it is drawing points, i read that it is because the mouse drag happens at intervals, if so how should i record the points?

我可以知道是否有任何绘制线条的公式?目前我正在 Java 中实现手绘线,但是绘制时下面的代码不是我所期望的。我试过 g.drawLine(arg0.getX(), arg0.getY(), arg0.getX(), arg0.getY()); ,但是绘制的线不是连续的,而是绘制点,我读到这是因为鼠标拖动每隔一段时间发生,如果是这样,我应该如何记录点?

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;

import javax.swing.JPanel;

public class STDrawingArea extends JPanel implements MouseListener, MouseMotionListener {
    /**
     * 
     */
    private static final long serialVersionUID = 1L;

    int xPressed,yPressed;
    int xReleased,yReleased;
    int xDragged,yDragged;
    public STDrawingArea()
    {
        setPreferredSize(new Dimension(1280, 700));
        setBounds(0, 0, 1280, 700);
        setBackground(Color.WHITE);
        addMouseListener(this);
        addMouseMotionListener(this);

    }



    @Override
    public void mouseDragged(MouseEvent arg0) {
        Graphics g = getGraphics();
        xDragged = xPressed;
        yDragged = yPressed;
        g.drawLine(xPressed, yPressed, arg0.getX(), arg0.getY());
        xDragged = arg0.getX();
        yDragged = arg0.getY();
    }

    @Override
    public void mouseMoved(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseClicked(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub
        xPressed = arg0.getX();
        yPressed = arg0.getY();
        System.out.println("xPressed: "+xPressed+" ,yPressed: "+yPressed);
    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub
        xReleased = arg0.getX();
        yReleased = arg0.getY();
        System.out.println("xReleased: "+xPressed+" ,yReleased: "+yPressed);
    }


}

回答by no.good.at.coding

A simple way to do this might be:

一个简单的方法可能是:

  1. Maintain a Listof Points in your component

  2. Override the paintComponent()method of the JPanel

    • Iterate over all points in your list of points
    • Draw lines between each pair of points (except the first and last, of course)
  1. 保持ListPoint在你的分量S

  2. 覆盖paintComponent()方法JPanel

    • 迭代点列表中的所有点
    • 在每对点之间画线(当然第一个和最后一个除外)


For example, you might make the following changes:

例如,您可以进行以下更改:

private ArrayList<Point> points = new ArrayList<Point>();

//...

public void mouseDragged(MouseEvent arg0) {
    points.add(arg0.getPoint());
    repaint(); //request Swing to refresh display as soon as it can
}

//...

protected void paintComponent(Graphics g)
{
    super.paintComponent(g);

    for (int i = 0; i < points.size() - 2; i++)
    {
        Point p1 = points.get(i);
        Point p2 = points.get(i + 1);

        g.drawLine(p1.x, p1.y, p2.x, p2.y);
    }
}

回答by Able Johnson

Some slight Changes are required

需要一些细微的变化

 @Override
public void mouseDragged(MouseEvent arg0) {
    Graphics g = getGraphics();

    g.drawLine(xDragged, yDragged, arg0.getX(), arg0.getY());
    xDragged = arg0.getX();
    yDragged = arg0.getY();
}

and

 @Override
public void mousePressed(MouseEvent arg0) {
    // TODO Auto-generated method stub
    xPressed = arg0.getX();
    yPressed = arg0.getY();
    System.out.println("xPressed: "+xPressed+" ,yPressed: "+yPressed);
    xDragged=xPressed;
    yDragged=yPressed;
}

I have compiled and executed this code and found its perfectly working..:-)

我已经编译并执行了这段代码,发现它完美地工作..:-)

回答by Indranil Das

Try This. It's working. There is no need to use the Point class and iterate the 'for' loop, If you wanna simply make a Freehand Drawing.

试试这个。它正在工作。如果您只想制作手绘图,则无需使用 Point 类并迭代“for”循环。

    import java.awt.BorderLayout;
    import java.awt.Color;
    import java.awt.Dimension;
    import java.awt.Graphics;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.MouseEvent;
    import java.awt.event.MouseListener;
    import java.awt.event.MouseMotionListener;
    import javax.swing.JButton;
    import javax.swing.JFrame;
    import javax.swing.JPanel;

    class STDrawingArea extends JPanel implements MouseListener,MouseMotionListener,ActionListener
    {
        int xPressed,yPressed;
        int xReleased,yReleased;
        int xDragged,yDragged;
        private JButton clear;
        public STDrawingArea()
        {
            setPreferredSize(new Dimension(1200, 500));
            setBounds(0, 0, 480, 500);
            //setBackground(Color.YELLOW);
            clear=new JButton("CLEAR");
            add(clear);
            clear.setBounds(540, 5, 100, 25);
            clear.addActionListener(this);
            addMouseListener(this);
            addMouseMotionListener(this);
        }

        @Override
        public void actionPerformed(ActionEvent e) 
        {
             if(e.getSource()==clear)
            {
                setOpaque(false);
                repaint();
            }
        }

        @Override
        protected void paintComponent(Graphics g)
        {
            g.drawLine(xPressed,yPressed,xDragged,yDragged);
            xPressed=xDragged;
            yPressed=yDragged;
        }

        @Override
        public void mouseDragged(MouseEvent arg0) {
            Graphics g = getGraphics();
            g.drawLine(xPressed, yPressed, arg0.getX(), arg0.getY());
            xDragged = arg0.getX();
            yDragged = arg0.getY();
            repaint();
        }

        @Override
        public void mouseMoved(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseClicked(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseEntered(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mouseExited(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }

        @Override
        public void mousePressed(MouseEvent arg0) {
            // TODO Auto-generated method stub
            setOpaque(true);
            xPressed = arg0.getX();
            yPressed = arg0.getY();
        }

        @Override
        public void mouseReleased(MouseEvent arg0) {
            // TODO Auto-generated method stub

        }
    }
    class Frame4 extends JFrame
    {
        private STDrawingArea da;
        public Frame4()
        {
            da=new STDrawingArea();
            da.setBackground(Color.YELLOW);
            da.setLayout(new BorderLayout());
            add(da);
        }
    }
    public class FreeHandDrwing 
    {
        public static void main(String s[])
        {
            Frame4 ob=new Frame4();

            ob.setVisible(true);
            ob.setBounds(100, 100, 1200, 500);
            ob.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        }
    }