drawPolygon 保持从起始(鼠标按下)位置到当前(鼠标拖动)位置的绘制线

2023-11-29

因此,我尝试从单击鼠标开始动态绘制多边形,直到停止拖动并释放为止。就这个问题而言,当我单击、向下拖动、然后向右拖动、然后向上拖动、然后向左拖动时,不会绘制方形轮廓,而是会发生以下情况:https://i.stack.imgur.com/QsYw9.jpg

有什么建议么?

Notes:

model.addPolygon() 创建一个具有起点的多边形并将其添加到名为“polys”的 ArrayList 中

model.addPolygonPoint() 将点添加到存储在“polys”中的创建的多边形中

我的绘画函数通过多边形迭代来绘画

public void mousePressed(MouseEvent e) {                
    oldX = e.getX();
    oldY = e.getY();
    model.addPolygon(oldX, oldY);     
}

public void mouseDragged(MouseEvent e) {
    currentX = e.getX();
    currentY = e.getY();
    model.addPolyPoint(currentX, currentY);
    repaint();
}

。 。 。然后在paintComponent中:

   for (ListIterator<Polys> iter = 
                model.polys.listIterator(model.polys.size()); 
                iter.hasPrevious();){
            graphics2D.draw(iter.previous().poly);

全漆组件:

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    if (image == null) {
        image = createImage(getSize().width, getSize().height);
        graphics2D = (Graphics2D) image.getGraphics();
        graphics2D.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                RenderingHints.VALUE_ANTIALIAS_ON);
    }
    g.drawImage(image, 0, 0, null);

    for (ListIterator<Polys> iter = 
            model.polys.listIterator(model.polys.size()); 
            iter.hasPrevious();){
        graphics2D.draw(iter.previous().poly);

        }   
    }

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;

public class Testing {

    private static int lastX;
    private static int lastY;

    private static int modX;
    private static int modY;

    private static final BasicStroke STROKE = new BasicStroke(2.0F);

    private static final Point[] SHAPE = new Point[]{

            new Point(10, 10),
            new Point(10, 40),
            new Point(60, 90),
            new Point(50, 50)

    };

    public static void main(final String[] args) {

        final JFrame frame = new JFrame("Polygon Movement");
        final JPanel pane = new JPanel() {
            @Override
            public void paintComponent(final Graphics g1) {
            final Graphics2D g = (Graphics2D) g1;
            g.setColor(Color.RED);
            g.translate(modX, modY);
            g.setStroke(STROKE);
            for (int i = 0; i < SHAPE.length; i++) {
                g.drawLine(SHAPE[i].x, SHAPE[i].y, SHAPE[(i + 1) % SHAPE.length].x, SHAPE[(i + 1) % SHAPE.length].y);
            }
        }
    };
    pane.addMouseMotionListener(new MouseMotionAdapter() {
        @Override
        public void mouseDragged(MouseEvent e) {
            modX += e.getX() - lastX;
            modY += e.getY() - lastY;
            lastX = e.getX();
            lastY = e.getY();
            frame.repaint();
        }
    });
    pane.addMouseListener(new MouseAdapter() {
        @Override
        public void mousePressed(MouseEvent e) {
            lastX = e.getX();
            lastY = e.getY();
        }
    });

        pane.setPreferredSize(new Dimension(200, 200));
        frame.add(pane);
        frame.pack();
        frame.setVisible(true);

    }

}

正如你所看到的,我用定义的点制作了一个基本形状。这是最有效的方法,除非您想改变基本形状(这里是静态的)。在这种情况下,您可以找到鼠标“抓取”的点并修改该点。无论哪种方式,都不需要添加或删除点。我使用条款lastX代替oldX只是根据喜好。

BasicStroke 是相当可选的,与转换为Graphics2D目的。

该行:

g.drawLine(SHAPE[i].x, SHAPE[i].y, SHAPE[(i + 1) % SHAPE.length].x, SHAPE[(i + 1) % SHAPE.length].y);

如果你以前尝试过这个东西,应该会有意义。它迭代所有点,从当前 (SHAPE[i]) 到下一个 (SHAPE[(i + 1) & SHAPE.length).

这个逻辑背后的原因是,你有 4 点,就像我们在这里所做的那样。通过它们的最后一次迭代,您将得到i = 3。由于这一点以及数组仅包含 4 个索引 (0-3),我们必须将该值恢复为零。为了简单起见,我使用% SHAPE.length所以不需要特殊情况。

我还选择使用适配器,因为 7 种可能的方法中只需要 2 种方法。

如果您有任何疑问,请随时向我询问。

~Legend

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

drawPolygon 保持从起始(鼠标按下)位置到当前(鼠标拖动)位置的绘制线 的相关文章

随机推荐