在具有子面板的 jPanel 上绘图

2023-12-19

我有一个 jPanel,其中包含许多可以拖动的子面板。我想做的是画出将其中一些子面板连接在一起的线。

然而,虽然这看起来应该很简单,但事实证明非常令人沮丧。我得到的最好的方法是重写原始 jPanel 中的 PaintComponent 函数,如下所示:

panCharDisplay = new javax.swing.JPanel() {
    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        paintLines(g);
    }
};

然后画线如下:

public void paintLines(Graphics g) {
    g.setColor(Color.BLUE);
    for (Character c : characters) {
        if (c.female && c.spouse != null) {
            g.drawLine(c.display.getX(), c.display.getY(), c.spouse.display.getX(), c.spouse.display.getY());
        }
    }
}

从某种意义上说,这是有效的,因为它在技术上确实在正确的位置、正确的颜色等处绘制了线条,但前提是我滚动到远离线条应在的位置,然后再向后滚动。每当我在周围拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制线条的一部分,并且不会擦除之前的部分。这些线条还显示在子面板下方而不是上方,这使得它们很多时候都隐藏起来。

我认为这样做的原因是我在错误的时间绘制了线条,并且需要在绘制子面板之后绘制它们,并且还要确保每次拖动面板时都重新绘制它们。

是否还有其他地方可以进行覆盖以使线条显示更一致?我尝试的另一种方法是创建一个扩展 JPanel 的类,并尝试使用它来处理绘图,但我根本无法让它工作。


每当我在周围拖动一个组件时,它都会导致奇怪的图形错误,因为它只绘制线条的一部分,并且不会擦除之前的部分。

当您拖动面板时,您可能需要在面板的父级上调用 repaint() 。

这些线条还显示在子面板下方而不是上方,这使得它们很多时候都隐藏起来。

您应该能够覆盖paint() or paintChildren()方法而不是 PaintComponent() 方法。无论您重写哪种方法,请确保首先调用 super.XXX(),以便在尝试绘制线条之前完成默认绘制。

就我个人而言,我喜欢组件下方绘制的线条,如 Trashgod 中所示图形面板 https://sites.google.com/site/drjohnbmatthews/graphpanel例子。该示例对形状进行了自定义绘制,但我猜想组件的逻辑是相似的。

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

在具有子面板的 jPanel 上绘图 的相关文章

  • 合并 2 个 .jks 信任库文件

    我正在使用启用了 SSL 的 Tomcat 并使用信任库进行客户端身份验证 我有两个 jks trustore 文件 第一个 我将其用于 PROD 环境 另一个用于 TEST 环境客户端证书 我在 Tomcat 上部署了 Web 应用程序
  • 如何创建仅接受字母数字字符的正则表达式? [复制]

    这个问题在这里已经有答案了 可能的重复 字母数字和下划线的正则表达式 https stackoverflow com questions 336210 regular expression for alphanumeric and unde
  • 如何从球衣服务端点发送实体列表?

    我正在从球衣服务器发送实体列表 在客户端 我试图获取这些实体列表 但它给了元帅例外 为什么它在元素名末尾添加 s 即 emps 而不是 emp XmlRootElement public class Emp Server side code
  • 在 JList 中写一些东西

    嘿 我还有另一个问题 我创建JList在我的主窗口中 现在我想向其中添加一些内容 我这样做 private void jButton2ActionPerformed java awt event ActionEvent evt Dodaj
  • 如何在 Java 中复制对象?

    考虑下面的代码 DummyBean dum new DummyBean dum setDummy foo System out println dum getDummy prints foo DummyBean dumtwo dum Sys
  • 是否有任何理由使用 ZoneId.of("UTC") 而不是 ZoneOffset.UTC ?

    有什么理由使用ZoneId of UTC 代替ZoneOffset UTC 我们知道两者之间的区别 如ZoneOffset UTC 和 ZoneId of UTC 之间有什么区别 https stackoverflow com questi
  • Byte[] 和 java.lang.OutOfMemoryError 按位读/写文件

    我正在努力擦除 Android 中的一些可用空间 这是我的代码 private void creatingFileDelete int size int passMode File lastFile new File Environment
  • 如何使用Gson将JSONArray转换为List?

    在我的 Android 项目中 我试图将收到的 JSONArray 转换为列表 在 的帮助下这个答案 https stackoverflow com questions 8371274 how to parse json array in
  • 基于磁盘的 HashMap [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 Java 是否有 或者是否有可用的库 允许我拥有基于磁盘的 HashMap 它不需要是原子的或任何东西
  • java springrabbit - 优雅地拒绝消息

    我有以下侦听器方法 Override public void onMessage Message message Channel channel try do something bad catch Exception e try long
  • java多线程中“私有最终对象”锁定有什么用?

    java多线程中 私有最终对象 锁定有什么用 据我的理解 我认为要使一个类成为线程安全的 我们应该使用内部锁定 将所有方法标记为同步并使用 this 将它们锁定在对象的监视器上 或者我们可以用方法中的私有最终对象锁替换类的 this 上标记
  • 是否有适用于 Java 的 CalDAV 客户端库? [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我想使用 CalDAV 协议与我的日
  • Java 日期和 MySQL 时间戳时区

    我正在编辑一段代码 其基本功能是 timestamp new Date 然后坚持下去timestamp中的变量TIMESTAMPMySQL 表列 然而 通过调试我看到Date显示在正确时区的对象 GMT 1 当持久化在数据库上时 它是GMT
  • 如何预先填充 JFileChooser 将“文件名”?

    我打算用数据库中的名称填充 JFileChooser 但使用标准 JFileChooser 对话框进行加载 删除 保存和另存为 我想给用户留下这样的印象 他们正在处理文件系统 而在后端使用数据库来保存更改 用户不应该能够浏览到不同的目录进行
  • 为什么找不到 getservletcontext?

    我正在尝试使用getServletContext getRealPath 但我不断收到此错误 cannot find symbol symbol method getServletContext location interface jav
  • 使用 SimpleDateFormat、Java 进行错误的日期解析

    我需要使用日期模式 yyyy MM dd 解析输入字符串中的日期 如果日期采用任何其他格式 则抛出错误 这是我解析日期的代码 private void validateDate throws MyException Date parsedD
  • 不鼓励在Web应用程序中使用线程吗?

    我们与同事就在 Java 的 Web 应用程序中使用线程进行了激烈的讨论 他们的观点是 不建议在 Java Web 应用程序中使用线程 因为它们不受容器管理 一般来说 我对此表示同意 因为线程可能会干扰容器 但是 如果它不是 Java EE
  • 如何将元素添加到通用集合

    我想知道如何将专用对象添加到通用集合中 我正在使用以下代码 Collection
  • Android NDK - 仅用 C/C++ 编写

    有没有一种可能的方法可以使用 C C 编写整个 NDK 应用程序 而无需像 hello jni 示例项目 HelloJni java 中那样的 Java 入门 类 以某种方式创建一个 HelloJni c 来执行相同的操作 从 Androi
  • Spring - 使用存储过程时使用 simplejdbccall 进行批量更新

    我正在使用 spring jdbc 模板 使用存储过程创建记录 public Long create City obj SimpleJdbcCall jdbcCall new SimpleJdbcCall getJdbcTemplate g

随机推荐

  • ASP.NET MVC / EF4 / POCO / Repository - 如何更新关系?

    我之间有 1 关系Review and 建议 我的模型的相关部分 也是 EF4 映射的 POCO public class Review public ICollection
  • REST 客户端 VS 代码扩展 POST 与 application/json 无法识别正文

    标题是非常不言自明的 我正在使用休息 电子邮件受保护 cdn cgi l email protection由 Huachao Mao Visual Studio Code 扩展 编写 POST 请求无法识别我传递的正文 顺便说一句 后端是带
  • 使用 ALB Ingress Controller 将非 www 重定向到 www

    我正在尝试重定向non www请求www 我检查了这里的注释https kubernetes sigs github io aws alb ingress controller guide ingress annotation https
  • 允许小数比的 ng-pattern

    我有一个ng pattern验证 4 6 的配给量 如下所示 ng pattern d d 我还想验证十进制数字是否与上述验证一起作为口粮输入 示例 5 4 7 1 我尝试通过给予ng pattern as ng pattern 0 9 1
  • 为什么 Rust 需要明确的生命周期?

    我正在读一生一章 https doc rust lang org book first edition lifetimes htmlRust 书中的内容 我在命名 显式生命周期中遇到了这个示例 struct Foo lt a gt x a
  • 提交点击时从 asp.net mvc 文本框获取值

    如何检索 asp net mvc 中文本框的值以将该值存储到某个变量 我有一个像这样的文本框在索引视图页面上 我有一个这样的按钮
  • ASP.net MVC 或简单的 C# 从模板生成文件

    我有一个 Asp Net Mvc 5 应用程序后端 我想在我的控制器中添加一个在服务器文件夹中动态创建 html 的函数 我希望这个 html 是从模板生成的 例子 模板 CSharpVar 在我的控制器中 MyObject mObj ne
  • vmware 工作站无法与 Windows 10 Pro 1903 配合使用

    我已将 Windows 10 PRO 更新到 1903 重新安装 VMware Workstation 并在运行时设置现有虚拟机时出现以下错误 VMware Workstation 和 Device Credential Guard 不兼容
  • UITextField 自动完成?

    我想弄清楚是否有一种方法可以在UITextField对于特定值 我知道UITextField可以使用 iPhone 字典来做到这一点 很像在 safari 中搜索 google 等 但我希望能够以编程方式使其正确到我指定的某些值 这个怎么做
  • 适用于 OS X 和 Django 的 Psycopg2 安装

    我想使用PostGreSQL数据库与Django 我首先安装了驱动psycopg2 with pip and virtualenv PATH PATH Library PostgreSQL 9 3 bin pip install psyco
  • “函数已经有了身体”

    这是什么意思 1 gt c users vitali documents visual studio 2010 projects salam tools cpp 107 error C2084 function bool readXMLIn
  • 资源 (RESX) 文件混乱

    我有一个名为 Localize resx 的资源文件 其中包含英文字符串 我将其复制并粘贴到同一文件夹 App GlobalResources 中 VS 创建了一个副本 我将副本重命名为 Localize sl resx 将原始重命名为 L
  • Angular-cli 未能正确安装

    我想知道你是否能帮助我 我尝试通过 npm 命令安装 angular cli npm install g angular cli 但是我收到很多消息 并且 ng 命令不起作用 我得到的一些错误如下 gt email protected cd
  • 如何在Flutter中更改整个主题的文本颜色?

    我可能缺少一些明显的东西 有没有one可以更改 Flutter 应用程序中所有文本颜色的属性 我现在的做法是 在我的 MaterialApp 中 theme ThemeData textTheme Theme of context text
  • 如何使用 PHP 查找下个月的第一天以及截至该日期的剩余天数

    如何找到下个月的第一天以及从今天到今天的剩余天数 谢谢 创建下个月第一天 00 00 的时间戳 firstDayNextMonth strtotime first day of next month 距该日期的天数是从现在到当时的秒数除以
  • DraggableScrollableSheet 内的 Listview 不会在颤动中滚动

    我设计了非常重的嵌套设计 如下所示 当我的列表展开时 列表视图似乎没有滚动 问题是什么 底部表被展开 但里面的列表视图没有焦点 如果我滚动触摸 营业时间 文本 它开始滚动 但当它向上移动时 我无法将其向下滑动 showDialog Buil
  • 为什么是新线程而不是 future {...}

    这个答案 https stackoverflow com a 17215663 1714997指示如何转换java util concurrent Future into scala concurrent Future 同时管理阻塞发生的位
  • XCode:无法启动“APP_X_Y”-“A”数据包返回错误:-1

    我正在尝试让我的应用程序在模拟器和我的设备上再次运行 在出现此错误之前 我经历了 XCode 签名错误的漫长过程 但我知道我似乎真的陷入了困境 错误 当我尝试在设备上启动应用程序时 它的构建没有任何错误 但安装应用程序后我收到错误消息 无法
  • 使用 GitHub 细粒度令牌和 git pull 通过 HTTPS

    问题 有没有办法将 GitHub 细粒度 PAT 的优点与简单性结合起来git pull通过 HTTPS 如果是这样 那又如何呢 背景 GitHub 有 经典 和 细粒度 个人访问令牌 PAT 转到 设置 gt 开发者设置 即可查看这些内容
  • 在具有子面板的 jPanel 上绘图

    我有一个 jPanel 其中包含许多可以拖动的子面板 我想做的是画出将其中一些子面板连接在一起的线 然而 虽然这看起来应该很简单 但事实证明非常令人沮丧 我得到的最好的方法是重写原始 jPanel 中的 PaintComponent 函数