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

使用Java的Path2D创建钢笔工具时遇到的问题

方弘
2023-03-14
问题内容

我一直在尝试使用Path2D类和鼠标侦听器为Java绘图程序创建钢笔工具,但结果令人困惑。该工具将工作几秒钟,但随后整个应用程序将冻结,必须关闭。(这里没有例外;程序只会冻结)。这是一个说明问题的SSCCE:

import java.awt.BasicStroke;
import java.awt.event.MouseAdapter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class PenDemoPanel extends JPanel {

    private Point start;
    private Point stop;
    private Shape shape;

    public PenDemoPanel() {
        setBackground(Color.white);
        setPreferredSize(new Dimension(600, 600));
        PathListener listener = new PathListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }

    public void paintComponent(Graphics gc) {
        super.paintComponent(gc);

        Graphics2D g2 = (Graphics2D) gc;

        if (start != null && stop != null) {
            BasicStroke stroke = new BasicStroke(1);
            shape = stroke.createStrokedShape(shape);
            g2.draw(shape);
            g2.fill(shape);
        }

    }

    private class PathListener
        extends MouseAdapter {

        public void mousePressed(MouseEvent event) {
            start = event.getPoint();
            Path2D path = new Path2D.Double();
            shape = path;
        }

        public void mouseDragged(MouseEvent event) {
            stop = event.getPoint();

            Path2D path = (Path2D) shape;
            path.moveTo(start.x, start.y);
            path.lineTo(stop.x, stop.y);
            shape = path;
            start = stop;

            repaint();

        }

        public void mouseReleased(MouseEvent event) {
            Path2D path = (Path2D) shape;
            path.closePath();
            shape = path;
            repaint();
        }
    }

    public static void main(String[] args) {
        PenDemoPanel shapes = new PenDemoPanel();

        JFrame frame = new JFrame("PenDemo");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().add(shapes);

        frame.pack();
        frame.setVisible(true);
    }
}

我编写了自己的Path类,在这里可以很好地工作,但是我想在Path2D类中使用一些其他功能。

我在这里做错什么了吗?还是Path2D无法执行我想做的事情?

任何帮助将不胜感激。


问题答案:

问题似乎出在将笔划形状分配回形状上。如果您避免这样做,请使用该应用程序。保持响应。可见

import java.awt.BasicStroke;
import java.awt.event.MouseAdapter;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Shape;
import java.awt.event.MouseEvent;
import java.awt.geom.Path2D;
import javax.swing.*;

public class PenDemoPanel extends JPanel {

    private Point start;
    private Point stop;
    private Shape shape;

    public PenDemoPanel() {
        setBackground(Color.white);
        setPreferredSize(new Dimension(600, 600));
        PathListener listener = new PathListener();
        addMouseListener(listener);
        addMouseMotionListener(listener);
    }

    public void paintComponent(Graphics gc) {
        super.paintComponent(gc);

        Graphics2D g2 = (Graphics2D) gc;

        if (start != null && stop != null) {
            BasicStroke stroke = new BasicStroke(1);
            Shape strokedShape = stroke.createStrokedShape(shape);
            g2.draw(strokedShape);
            g2.fill(strokedShape);
        }
    }

    private class PathListener
        extends MouseAdapter {

        public void mousePressed(MouseEvent event) {
            start = event.getPoint();
            Path2D path = new Path2D.Double();
            shape = path;
        }

        public void mouseDragged(MouseEvent event) {
            stop = event.getPoint();

            Path2D path = (Path2D) shape;
            path.moveTo(start.x, start.y);
            path.lineTo(stop.x, stop.y);
            shape = path;
            start = stop;

            repaint();
        }

        public void mouseReleased(MouseEvent event) {
            Path2D path = (Path2D) shape;
            try {
                path.closePath();
            } catch(Exception ingore) {
            }
            shape = path;
            repaint();
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                PenDemoPanel shapes = new PenDemoPanel();

                JFrame frame = new JFrame("PenDemo");

                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.getContentPane().add(shapes);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }
}


 类似资料:
  • 用钢笔工具绘制直线段 使用 “钢笔 ”工具可以绘制的最简单路径是直线,方法是通过单击 “钢笔 ”工具创建两个锚点。继续单击可创建由角点连接的直线段组成的路径。 单击钢笔工具将创建直线段。 1选择钢笔工具。 2将钢笔工具定位到所需的直线段起点并单击,以定义第一个锚点(不要拖动)。注:单击第二个锚点之前,您绘制的第一个线段将不可见。(在 Photoshop 中选择 “橡皮带 ”选项以预览路径段。)此外

  • Photoshop 提供多种钢笔工具以满足您的使用案例和创意样式: 通过弯度钢笔工具,可以直观地绘制曲线和直线段。 标准钢笔工具可用于精确绘制直线段和曲线。 自由钢笔工具可用于绘制路径,就像用铅笔在纸上绘图一样。 磁性钢笔选项可用于绘制与图像中定义的区域边缘对齐的路径。 使用 Shift+ P 组合键可循环切换钢笔组中的工具。 使用 Shift+P 组合键可循环切换钢笔工具 可以组合使用钢笔工具和

  • 我使用以下方式安装Gatsbyjs: 它安装,然后当我试图创建一个新的网站,它显示一些错误。 我尝试了盖茨比新网站,但它显示了一些错误: PS C:\Users\Klawnny\Dropbox\react电子商务 gatsby-cli@2.7.53更新了一个包在46.004s PS C:\用户\克劳尼\Dropbox\电子商务与反应 文件C:\Users\Klawnny\AppData\Roami

  • ...13。repo init-u https://github.com/freescale/fsl-community-bsp-platform-b fido @debian:~$/opt/poky/1.8+snapshot/sysroots/x86_64-pokysdk-linux/usr/bin/arm-poky-linux-gnueabi/arm-poky-linux-gnueabi-gc

  • 当使用钢笔工具时,很难绘制路径,除非画布上有锚点。从 Illustrator CC 2014 版开始,“钢笔工具”会显示路径预览,即前一个锚点到指针当前位置的绘制路径。 使用钢笔工具单击一次画板绘制平滑点,并拖动鼠标以按要求创建手柄。 注意:当您使用钢笔工具绘制平滑点时,反向手柄始终相等且成对。拖动平滑点手柄时按住 Cmd/Ctrl 可创建长度不等的手柄(配对保持不变)。 松开鼠标按钮。当您在画板

  • 我不太熟悉OpenLDAP,但我试图让一个本地实例工作,以便在开发中测试一个客户机,该客户机需要memberOf属性。 根据http://www.OpenLDAP.org/doc/admin24/guide.html#的说明,我已经在Centos7虚拟机上下载并安装了OpenLDAP,这是一个快速入门指南。我没有使用包管理来安装它。因为我使用的是2.4.45,所以它使用的是cn=config OL