当 setLabelsClipped 为 true 时,顶点标签在顶点外部、滚动条上和其他组件上绘制

2024-02-01

我使用 JGraph 一段时间了,当您将标签裁剪设置为 true 时,似乎存在绘画问题:

下面的简化示例显示了您可能会遇到的实际应用程序中的问题:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.event.ActionEvent;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSplitPane;
import javax.swing.JTextArea;

import com.mxgraph.swing.mxGraphComponent;
import com.mxgraph.view.mxGraph;

/** it's an app! */
public class GraphApp extends JFrame {
    private mxGraph graph;
    private mxGraphComponent graphComponent;
    private boolean labelsClipped = false;

    /** @return the splitpane */
    public JSplitPane getSplitpane() {
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT);
        graph = new mxGraph();
        graph.getModel().beginUpdate();
        graph.removeCells(graph.getChildCells(graph.getDefaultParent(), true, true));
        for (int i = 0; i < 10; i++)
            graph.insertVertex(null, null, "very_very_long_vertex_" + i, 10 * i, 10 * i, 100, 50);
        graph.getModel().endUpdate();
        graph.setLabelsClipped(labelsClipped);
        graphComponent = new mxGraphComponent(graph);
        JTextArea area = new JTextArea("There's overpaint below this text."); //$NON-NLS-1$
        splitPane.add(graphComponent, JSplitPane.LEFT);
        splitPane.add(area, JSplitPane.RIGHT);
        splitPane.setDividerLocation(70);
        return splitPane;
    }

    private JButton getButton() {
        JButton button = new JButton(new AbstractAction() {
            @Override
            public void actionPerformed(ActionEvent e) {
                labelsClipped = !labelsClipped;
                graph.setLabelsClipped(labelsClipped);
                GraphApp.this.repaint();
            }
        });
        button.setText("Swap setLabelsClipped");
        return button;
    }

    private JPanel getPanel() {
        JPanel panel = new JPanel(new BorderLayout());
        panel.add(getSplitpane(), BorderLayout.CENTER);
        panel.add(getButton(), BorderLayout.SOUTH);
        return panel;
    }

    public static void main(String[] args) {
        GraphApp app = new GraphApp();
        app.add(app.getPanel());
        app.setPreferredSize(new Dimension(300, 100));
        app.setVisible(true);
        app.pack();
    }
}

值得注意的是,覆盖仅发生在顶点的范围内。以下是被剪掉的名字:

并进行剪辑:

我现在正在研究 JGraphx 源代码,看看问题出在哪里。以前有人解决过这个问题吗?显然,设置 graph.setLabelsClipped(false) 可以解决这个问题,但我不想让我的顶点标签溢出到我的顶点边界上。


我发现问题出在哪里了。

从 com.mxgraph.view.mxGraph 中,如果添加一点点绘制代码,您可以看到剪辑被错误地设置为一个矩形,如我的示例所示,该矩形可能位于实际图形组件之外。

        if (clippedCanvas instanceof mxGraphics2DCanvas)
        {
            System.out.println("setting new clip");
            Graphics g = ((mxGraphics2DCanvas) clippedCanvas).getGraphics();
            clip = g.getClip();
            g.setClip(newClip);
            ((mxGraphics2DCanvas) clippedCanvas).paintRectangle(((mxGraphics2DCanvas) clippedCanvas).getGraphics().getClipBounds(), Color.GREEN, Color.WHITE);
        }

如果我们绘制标签正在使用的剪切区域,我们就可以看到问题所在。

实际上,我们应该只绘制原始画布和新剪切矩形的交集。下图显示了剪裁矩形在被新剪裁矩形践踏之前的样子:

解决这个问题的方法很简单:

        if (clippedCanvas instanceof mxGraphics2DCanvas)
        {
            Graphics g = ((mxGraphics2DCanvas) clippedCanvas).getGraphics();
            clip = g.getClip();
            if (clip instanceof Rectangle)
            {
                g.setClip(newClip.intersection((Rectangle) clip));
            }
            else
            {
                g.setClip(newClip);
            }
        }

我很想知道原始代码是否有意进行剪辑设置。我有点怀疑。

我的修复也默认为他们的实现,以防有人用他们的剪辑形状做了一些古怪的事情,就像某种 CYA 一样。可能不需要,因为裁剪不能保证适用于矩形以外的任何东西:

http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#setClip(java.awt.Shape) http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html#setClip(java.awt.Shape)

代码似乎位于 github 上,所以希望我能将修复程序推送到那里:

https://github.com/jgraph/jgraphx https://github.com/jgraph/jgraphx

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

当 setLabelsClipped 为 true 时,顶点标签在顶点外部、滚动条上和其他组件上绘制 的相关文章

  • Spring JSON序列化、Gson反序列化

    我目前在某些内部对象的反序列化方面遇到问题 在春天 我在使用输出之前初始化所有对象 ResponseBody 例如 这是一个响应 id 1 location id 1 extra location data id 2 location 1
  • 无法解析 Java 中的方法

    我有一个Question具有 4 个的对象Answer里面的物体 在 Question java 我有一个方法是 public Answer getA return a 在另一种方法中我有 if questions get randomNu
  • Java ASN.1 编译器

    现在我正在使用二进制笔记 http bnotes sourceforge net 解析 ASN 1 文件以在 Java 项目中使用 它采用 ASN 1 定义并生成 Java 类 让我可以操作 ASN 1 文件 我用扩展标记碰壁了 因为它不支
  • 连接到 Apache Kafka 多节点集群中的 Zookeeper

    我按照以下说明设置了多节点 kafka 集群 现在 如何连接到zookeeper 是否可以从 JAVA 中的生产者 消费者端仅连接到一个 ZooKeeper 或者是否有一种方法可以连接所有 ZooKeeper 节点 设置多节点 Apache
  • 将 hyperjaxb3 升级到 jpa 2.1

    我正在尝试在使用 maven jpa hibernate 和 hyperjaxb 的 eclipse 项目中升级到 JPA 2 1 当我尝试执行以下操作时出现以下错误Run As Run on Server从日食内部 java lang N
  • 给定一个 IP 地址列表,如何找到最小值、最大值?

    在Java中 我有一个ip地址的数组列表 我如何找到最小值和最大值 我已经使用了 Collection min 但在以下情况下它不起作用 192 168 0 1 lt min 192 168 0 250 192 168 0 9 lt max
  • 在java中查找OSX的版本

    我需要测试 java 中 osx 的版本是否 Try System getProperty os name and or System getProperty os version 它返回字符串 HERE https docs oracle
  • Struts ActionForm 属性应该是什么类型?

    我使用 Struts 1 2 4 继承了这个巨大的遗留 Java Web 应用程序 我有一个关于 ActionForms 的具体问题 其中一些仅具有字符串属性 即使对于数字 其中一些使用看似合适的类型 整数 日期 字符串等 这里的最佳实践是
  • 如何将 java ArrayList 转换为等效的 double[] [重复]

    这个问题在这里已经有答案了 可能的重复 如何在 Java 中从 List 转换为 double https stackoverflow com questions 6018267 how to cast from listdouble to
  • 在 Spring Boot 异常处理期间保留自定义 MDC 属性

    简短版本 有足够的细节 如何保留添加在MDC中的属性doFilter 的方法javax servlet Filter执行 public void doFilter ServletRequest request ServletResponse
  • 处理大数据表时应该如何使用Hibernate Mapping

    问题定义 我有一个包含大量数据 超过 100 000 行 的数据库表 表结构如下 AppID DocID DocStatus 1 100 0 1 101 1 2 200 0 2 300 1 每个 applicationID 可能有数千个文档
  • 更改 WireMock __files 目录

    来自docs http wiremock org docs stubbing 要从文件中读取正文内容 请将文件放在 files 下 目录 默认情况下 这应该位于 src test resources 下 从 JUnit 规则运行时 当独立运
  • 优化两个三位数乘积的最大回文数?

    我正在研究一个面试问题 我被问到这个问题 我应该编写一个程序 从两个三位数的乘积中找到最大的回文数 这里是question https projecteuler net problem 4 我想出了这种从底部开始的蛮力方法 public c
  • 计算事件之间的天数 - Android

    我一直在研究 Android API 并一直在寻找一种方法来计算当前日期和未来日期之间的天数 我对 android 还很陌生 而且我已经有几年没有做过 java 了 计算这个最简单的方法是什么 Thanks 最简单的方法是使用乔达时间 ht
  • 为什么 writeObject 抛出 java.io.NotSerializedException 以及如何修复它?

    我有这个异常 我不明白为什么会抛出它 或者我应该如何处理它 try os writeObject element catch IOException e e printStackTrace Where element is a Transf
  • Hibernate - 如何通过 Hibernate 将 java.net.URL 存储到数据库中

    我有一块田地URL countryURL in a Country班级 我想将其数据存储到COUNTRY通过 Hibernate 将表存储在数据库中 哪个休眠type我应该在休眠映射文件中使用
  • 运行外部进程的非阻塞线程

    我创建了一个 Java GUI 应用程序 它充当许多低级外部进程的包装器 该实用程序按原样运行 但迫切需要一项重大改进 我希望我的外部进程以非阻塞方式运行 这将允许我并行服务其他请求 简而言之 我希望能够在生成数据时处理来自外部进程的数据
  • 返回在 REST 控制器中包装 S3Object.getObjectContent() 的 ResponseEntity 是否安全?

    我正在开发一个 Spring Boot 应用程序 它应该允许用户通过指定的应用程序 REST 接口间接从 Amazon S3 下载文件 为此 我有一个 REST Controller 它向用户返回一个 InputStreamResource
  • Spring Boot 和安全性以及自定义 AngularJS 登录页面

    我正在为 Spring Security 实现一个自定义 AngularJS 登录页面 但遇到身份验证问题 遵循本教程 示例 以及他们的示例在本地运行良好 https github com dsyer spring security ang
  • 指定不带组件的GridBagLayout的网格参数

    我试图帮助另一个用户 但遇到了一个问题 我想用 GridBagLayout 来做到这一点 c1 c2 c3 10 80 10 v v r1 B1

随机推荐

  • 应用程序无法正确启动(0xc000007b)

    我有一个客户端 服务器应用程序 我一直在一台 PC 上开发它 现在需要两个串口 所以我向朋友借了一台PC 当我构建应用程序并尝试运行或调试它 无论是在 Delphi IDE 中还是从 Windows 文件管理器中 时 出现错误 应用程序无法
  • 如何更改鞋子应用程序的图标?

    我想知道是否可以更改我的鞋子应用程序的图标 我想象它以风格为导向 但我还没有找到任何东西 这可能吗 你可以这样做绿鞋 http github com ashbb green shoes 但你必须深入了解一下 这是我为 SciRuby 编写的
  • Python - 多个 %s 字符串

    如何在 python 输出中使用多个 s TEXT Hi your first name is s Fname 这工作正常 但是 TEXT Hi your first name is s and your last name is s Fn
  • 从函数返回“本地”char* 与从函数返回“本地”int* 之间的区别[重复]

    这个问题在这里已经有答案了 可能的重复 局部变量的内存可以在其作用域之外访问吗 https stackoverflow com questions 6441218 can a local variables memory be access
  • 如何在 phpstorm 中禁用 SQL 代码的突出显示?

    如何在 phpstorm 中禁用 SQL 代码的突出显示 我曾经禁用过所有 sql 检查 但是颜色和字体规则仍然过于严格 我的 php 字符串颜色规则 这是我想要实现的目标的示例 var php all text here is red S
  • 视口单位 vw/vh/vmin/vmax 不支持缩放吗?

    As per 如何正确使用 css values viewport relative lengths https stackoverflow com questions 30175730 how to properly use css va
  • 将 Redis Streams 输出转换为 Pandas Dataframe

    会是什么fastest方法来转换一个Redis流 https redis io topics streams intro输出 aioredis 客户端 hiredis 解析器 到 Pandas Dataframe 其中 Redis 流 ID
  • 如何在 OS X 上重新启动 nginx

    我在用着nginx在 OS X 10 8 上 全新安装nginx但找不到重新启动 nginx 的方法 除了kill nginx pid say kill 64116 想知道是否有更好的重启方法nginx 在Google和SO上找到了一些方法
  • iPhone 使用证书加密

    我必须加密一个字符串 并在 xCode 项目的 Resources 文件夹中有一个 CER x 509 这两天我一直在想怎么做 但没有成功 所以是时候问一下了 Apple 的文档非常难以阅读 而且我认为这个框架可能是最难理解的框架 两个示例
  • React-ui-tree 对触摸设备的拖放支持

    我正在尝试为支持触摸的设备添加 DnD 支持反应 ui 树 https github com pqx react ui tree它的行为似乎很奇怪 虽然拖动似乎开始于触摸移动事件并突然停止 但如果你从同一个位置拾取并移动 那么事情似乎就会起
  • Java正则表达式以逗号分隔但忽略注释内的逗号

    我需要正则表达式用逗号 分割字符串 但忽略注释部分中的逗号 更改你的正则表达式后我尝试了很多 但没有成功 例如 Command RTRV EQPT Completion Code DENY Error Code II AC Problem
  • SQL Server:使用元组 IN 子句进行多重连接

    我正在尝试连接 4 个具有复杂关系的表 由于要使用它的位置 它需要包含在单个查询中 但我遇到了麻烦 因为主查询和 IN 子句查询都将 2 个表连接在一起 并且查找是在两列上进行的 目标是输入一个SalesNum and SalesType并
  • 使用 pygame.transform.rotate 时内存不足

    我写了一个脚本 允许用户控制老鹰的精灵飞来飞去以学习pygame 看起来很好 直到我实现了一个旋转函数 使精灵根据其飞行方向旋转 移动一小会儿后 精灵变得非常模糊 很快就会弹出一个错误 内存不足 在这一行 eagle img pygame
  • NullPointerException 但编译?

    我正在编写一个简单的命令行游戏 我已经有很多功能了 这里只发布必要的功能 问题 程序可以编译 但是当levelup 被呼叫并选择了一个号码 我得到这个 You have 5 skill points to spend What would
  • 实体子类的专用缓存区域?

    我们拥有一个包含 100 多个实体类的广泛实体模型 所有实体类都是单个实体超类的子类 共享缓存模式已设置为ALL Entity Inheritance strategy InheritanceType JOINED Table name e
  • 这是什么意思: qq = qq || {}? [复制]

    这个问题在这里已经有答案了 我已经下载了一个 JavaScript 脚本 第一行是 qq qq 这是什么意思 它检查qq对于预先存在的真实值 http 11heavens com falsy and truthy in javascript
  • 安装私有 Go 模块:未知修订错误

    我有一个私人 Go 存储库 位于https github com myorg myrepo被另一个 Go 存储库使用并定义在go mod 当我尝试跑步时 go mod tidy下载所有依赖项 它返回以下错误 go github com my
  • 处理400后运行时错误

    设想 用户名和密码使用 WebApi 2 令牌身份验证进行身份验证 如果凭据正确 则返回令牌 但是 如果凭据不正确 则会返回 400 bad request 在我的 Ionic 2 项目中 如果收到响应 我会导航到下一页 如果收到错误 我会
  • Java中使用Selenium快速获取每个WebElement的类属性

    我正在寻找每个的类属性WebElement用硒快速在页面上 目前 我正在执行以下操作 allElements new ArrayList
  • 当 setLabelsClipped 为 true 时,顶点标签在顶点外部、滚动条上和其他组件上绘制

    我使用 JGraph 一段时间了 当您将标签裁剪设置为 true 时 似乎存在绘画问题 下面的简化示例显示了您可能会遇到的实际应用程序中的问题 import java awt BorderLayout import java awt Dim