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

标签 java awt polygon graphics2d java-2d

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

有什么建议吗?

注释:

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

    }

}

如您所见,我用定义的点制作了一个基本形状。这是最有效的方法,除非您希望改 rebase 本形状(这里是静态的)。在这种情况下,您可以找到鼠标“抓取”的点并修改该点。无论哪种方式,都不需要添加或删除点。我只是根据喜好使用术语 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 种方法。

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

~图例

关于java - drawPolygon 保持从起始(鼠标按下)位置到当前(鼠标拖动)位置的绘制线,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15396258/

相关文章:

java - 内存中带有文字字符串的 StringBuilder/StringBuffer

java - 如何从同一 JPanel 中的其他 JList 中的 JList 中选择一个项目

Java Swing : 'java.awt.AWTEventMulticaster.mouseMoved' error

java - 使用 Java 7 的 Linux 上的立体问题 - 如何在将组件添加到父组件后更改组件的 GC

java - 具有自动文本定位功能的 Graphics2D 生成图像

javascript - Google Maps API 绘图自定义标记 : Need help understanding this example I found

geometry - 如何使用 sequelize 检查特定 lat lng 是否位于多边形中

java - 如何通过 Volley 将旋转器数据发送到数据库

java - 在 Jersey 测试调用上设置查询参数

google-maps - 如何在使用 google map api 时显示多边形标题