使用 Java 的 Path2D 创建钢笔工具时出现的问题

2023-12-05

我一直在尝试使用 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);
            }
        });
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Java 的 Path2D 创建钢笔工具时出现的问题 的相关文章

  • Java Swing:从 JOptionPane 获取文本值

    我想创建一个用于 POS 系统的新窗口 用户输入的是客户拥有的金额 并且窗口必须显示兑换金额 我是新来的JOptionPane功能 我一直在使用JAVAFX并且它是不同的 这是我的代码 public static void main Str
  • Java中反射是如何实现的?

    Java 7 语言规范很早就指出 本规范没有详细描述反射 我只是想知道 反射在Java中是如何实现的 我不是问它是如何使用的 我知道可能没有我正在寻找的具体答案 但任何信息将不胜感激 我在 Stackoverflow 上发现了这个 关于 C
  • 如何找到给定字符串的最长重复子串

    我是java新手 我被分配寻找字符串的最长子字符串 我在网上研究 似乎解决这个问题的好方法是实现后缀树 请告诉我如何做到这一点或者您是否有任何其他解决方案 请记住 这应该是在 Java 知识水平较低的情况下完成的 提前致谢 附 测试仪字符串
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • 加速代码 - 3D 数组

    我正在尝试提高我编写的一些代码的速度 我想知道从 3d 整数数组访问数据的效率如何 我有一个数组 int cube new int 10 10 10 我用价值观填充其中 然后我访问这些值数千次 我想知道 由于理论上所有 3d 数组都存储在内
  • 控制Android的前置LED灯

    我试图在用户按下某个按钮时在前面的 LED 上实现 1 秒红色闪烁 但我很难找到有关如何访问和使用前置 LED 的文档 教程甚至代码示例 我的意思是位于 自拍 相机和触摸屏附近的 LED 我已经看到了使用手电筒和相机类 已弃用 的示例 但我
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 十进制到八进制的转换[重复]

    这个问题在这里已经有答案了 可能的重复 十进制转换错误 https stackoverflow com questions 13142977 decimal conversion error 我正在为一个类编写一个程序 并且在计算如何将八进
  • 如何为俚语和表情符号构建正则表达式 (regex)

    我需要构建一个正则表达式来匹配俚语 即 lol lmao imo 等 和表情符号 即 P 等 我按照以下示例进行操作http www coderanch com t 497238 java java Regular Expression D
  • JRE 系统库 [WebSphere v6.1 JRE](未绑定)

    将项目导入 Eclipse 后 我的构建路径中出现以下错误 JRE System Library WebSphere v6 1 JRE unbound 谁知道怎么修它 右键单击项目 特性 gt Java 构建路径 gt 图书馆 gt JRE
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • Java Integer CompareTo() - 为什么使用比较与减法?

    我发现java lang Integer实施compareTo方法如下 public int compareTo Integer anotherInteger int thisVal this value int anotherVal an
  • 在 Mac 上正确运行基于 SWT 的跨平台 jar

    我一直致力于一个基于 SWT 的项目 该项目旨在部署为 Java Web Start 从而可以在多个平台上使用 到目前为止 我已经成功解决了由于 SWT 依赖的系统特定库而出现的导出问题 请参阅相关thread https stackove
  • Eclipse Java 远程调试器通过 VPN 速度极慢

    我有时被迫离开办公室工作 这意味着我需要通过 VPN 进入我的实验室 我注意到在这种情况下使用 Eclipse 进行远程调试速度非常慢 速度慢到调试器需要 5 7 分钟才能连接到远程 jvm 连接后 每次单步执行断点 行可能需要 20 30
  • 仅将 char[] 的一部分复制到 String 中

    我有一个数组 char ch 我的问题如下 如何将 ch 2 到 ch 7 的值合并到字符串中 我想在不循环 char 数组的情况下实现这一点 有什么建议么 感谢您花时间回答我的问题 Use new String value offset
  • 如何从终端运行处理应用程序

    我目前正在使用加工 http processing org对于一个小项目 但是我不喜欢它附带的文本编辑器 我使用 vim 编写所有代码 我找到了 pde 文件的位置 并且我一直在从 vim 中编辑它们 然后重新打开它们并运行它们 重新加载脚
  • 如何在桌面浏览器上使用 webdriver 移动网络

    我正在使用 selenium webdriver 进行 AUT 被测应用程序 的功能测试自动化 AUT 是响应式网络 我几乎完成了桌面浏览器的不同测试用例 现在 相同的测试用例也适用于移动浏览器 因为可以从移动浏览器访问 AUT 由于它是响
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • Spring Boot @ConfigurationProperties 不从环境中检索属性

    我正在使用 Spring Boot 1 2 1 并尝试创建一个 ConfigurationProperties带有验证的bean 如下所示 package com sampleapp import java net URL import j
  • 使用 xpath 和 vtd-xml 以字符串形式获取元素的子节点和文本

    这是我的 XML 的一部分

随机推荐

  • React - TypeError:无法读取未定义的属性(读取“params”)

    所以我收到一条错误消息 TypeError Cannot readproperties of undefined reading params TypeError Cannot read properties of undefined re
  • 声明多维数组时出现堆栈溢出异常

    一般来说 我对编程有点陌生 并且在声明 3D 和 4D 数组时遇到了问题 我在主函数的开头有几个这样的声明 但我已将问题范围缩小到这 4 个 string reg perm mark name 64 64 64 short reg perm
  • 按 data.frame 中连续年份的子集

    我在 R 中有一个 data frame data table 如下 df lt data frame ID c rep A 20 year c 1968 1971 1972 1973 1974 1976 1978 1980 1982 19
  • Laravel OrderBy 关系计数

    我正在尝试获取最受欢迎的黑客马拉松 这需要按相应的黑客马拉松进行排序partipants gt count 抱歉 如果这有点难以理解 我有一个具有以下格式的数据库 hackathons id name hackathon user hack
  • 获取应用程序上下文返回 null

    以下模式被认为是从我的 Android 应用程序中的任何位置获取应用程序上下文的方法 但有时做MyApp getContext 返回空值 我尝试通过删除来更改架构static from getContext 这样我会做MyApp getIn
  • GZipStream 正在切断 XML 的最后一部分

    我创建了一个名为 AddGZip 的扩展方法 如下所示 public static void AddGZip this HttpResponse response response Filter new GZipStream respons
  • WCF 客户端使用证书和用户名/密码凭据?

    我正在使用 ASP NET 公司内部的 Web 服务 我使用 svcutil exe 连接到服务并从 wsdl 生成绑定和类 我可以连接到开发版本 该版本不需要身份验证 现在我们正在增加安全性 我的新 URI 使用 https 但还需要用户
  • 要列出的结果集

    我想用我的数据库字段值创建一个列表 有 2 列 名字和姓氏 我想创建一个列表 将名称列中的所有名称存储在字段中 然后添加到我的 DTO 中 这可能吗 您可以遵循的步骤 首先你需要有一个List
  • WinRT C# - 创建转换器字符串到字符串以绑定 Gridview

    今天我来找你是为了一个 小 问题 我不知道如何创建一个简单的转换器 因为这是第一次 而且我没有找到一个简单的例子 我想为 gridview 绑定创建一个 字符串到字符串 转换器 这是针对图像源的 我从一个对象中获取一个字符串 这是图像的名称
  • 如何保持 sql 依赖关系达到其目的

    我有一个控制台应用程序 我想继续观察数据库表中特定列的变化 我通过互联网阅读 发现 sql 依赖关系很适合我的目的 我开始了解它并做了以下事情 创建一个类 在构造函数中 我调用了静态函数start我调用了一个具有所有 sql 依赖项设置的函
  • 如何使用 Perl 查找和替换 XML 中的文本?

    我的 XML 文件看起来像这样
  • 如何将 DWORD RGBA 转换为整数?

    我必须将 DWORD 无符号长整型 RGBA 转换为四个 int 变量 R G B 和 A 到目前为止 我有这个函数将 4 个整数转换为 DWORD unsigned long RGBA2DWORD int iR int iG int iB
  • 启动时停止背景音频

    我可以通过在 info plist 文件中添加设置来使应用程序在移动到后台时播放音频 但是 当其他一些iOS应用程序播放背景音频时 当当前应用程序进入前台时 如何停止其他应用程序调用的背景音频呢 查看 Apple 的 AVAudioSess
  • MongoCommandException:命令失败,错误 8000 (AtlasError):“未发送 SNI 名称,请确保使用 MongoDB 3.4+ 驱动程序/shell。”

    我正在使用 Java 11 Maven 项目 作为 mongodb 免费层集群 版本 4 0 13 我正在尝试通过连接字符串 对于 3 6 驱动程序或更高版本 进行连接 例如 mongodb srv user email protected
  • 覆盖 Swift 中存储的属性

    我注意到编译器不允许我用另一个存储值覆盖存储的属性 这看起来很奇怪 class Jedi var lightSaberColor Blue class Sith Jedi override var lightSaberColor Red C
  • 汇编 Linux 系统调用与汇编 OS X 系统调用

    我在 Mac 上运行汇编代码时遇到问题 我目前正在阅读 Jeff Duntemann 的书 Assembly Step by Step 问题是它专注于为 32 位 Linux 系统编写汇编 我使用的是 64 位 mac os x 系统 我仍
  • 有条件参考

    我正在编写一个应用程序 它通过Component Object Model图书馆 我必须在 Visual Studio 项目本身中引用此 COM 库 以便我编写的应用程序能够正常工作 还有一个 NET 包装器库 我必须在 Visual St
  • ios13 深色模式更改无法被 tableview Cell 识别?

    我正在检查我现有的应用程序是否可以与 ios 13 新引入的黑暗模式功能正常工作 一切似乎都工作正常 只有我的一个表视图中的单元格背景没有根据模式 暗 亮 刷新 如果应用程序以深色模式启动 单元格也会显示正确的深色背景 如果应用程序处于后台
  • 我可以使用 unix utils 以编程方式将 ANSI 控制代码“烧入”文件吗?

    示例 我开始录音script 并尝试输入echo test但省略了 o 所以我退格来纠正它 When I cat typescript一切看起来都很正常 因为代码被解释了 但如果我使用less or vim I see ech test H
  • 使用 Java 的 Path2D 创建钢笔工具时出现的问题

    我一直在尝试使用 Path2D 类与鼠标侦听器一起为我的 Java 绘图程序创建一个钢笔工具 但结果令人困惑 该工具将工作几秒钟 但随后整个应用程序将冻结并必须关闭 这里没有发生异常 程序只是冻结 这是演示该问题的 SSCCE import