java - 使用鼠标事件的徒手画线

标签 java swing

请问有画线的公式吗?目前我正在 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);
    }


}

最佳答案

一个简单的方法可能是:

  1. 维护 ListPoint s 在你的组件中

  2. 覆盖 paintComponent() JPanel

    的方法
    • 遍历点列表中的所有点
    • 在每对点之间画线(当然除了第一个和最后一个)

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

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);
    }
}

关于java - 使用鼠标事件的徒手画线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6039831/

相关文章:

java - 如何使表格单元格编辑所做的更改永久生效?

Java-如何在不丢失现有绘图的情况下在 JFrame 上绘图

java - 将两个简单的 JLabel 添加到 jframe

Java 面板向下滚动

java - drawString 未正确写入字符串

Java 加载/进度条

java - 与 Google Guava 的范围联合

javax.xml.bind.UnmarshalException : unexpected element even if @XmlRootElement is added

java - 当我需要一个 String 时,R.string.XXX 从 strings.xml 返回一个 int

java - 为什么我的方法无法按字母顺序对链接列表进行排序?