当前位置: 首页 > 知识库问答 >
问题:

在IntelliJ的停靠面板中显示时,Graphstream呈现偶尔会消失

公羊招
2023-03-14

我正在将graphstream(www.graphstream-project.org)集成到JetBrains MPS(即IntelliJ)中。图形显示在IntelliJ的“工具窗口”中(侧面的面板,请参见屏幕截图)。

如果面板处于“浮动”模式(未对接),则不会出现问题(与graphstream单独使用时完全相同,即在JFrame中)。但在“对接”模式下(如屏幕截图),图形在某些情况下会消失,即工具窗口显示空白区域。

我无法重现导致问题的确切原因,但它似乎与UI相关。有时调整停靠面板的大小或在IntelliJ的某些完全不相关的部分中显示工具提示会触发“消失”,有时则不会。如果图形再次聚焦,则图表始终会重新出现(例如,单击空白白色区域)。

我觉得这是IntelliJ中的一个bug,但如果您有任何关于如何进一步调查该问题的想法(从哪里开始调试等),我将不胜感激。

代码 - 简短版本:有一个JPanel包含由Graphstream使用Viewer.getDefaultView()创建的DefaultView实例。这被移交给 MPS / IntelliJ API。

完整代码:

// construct the graph
Graph graph = new SingleGraph("Graph");
graph.addAttribute("ui.quality");
graph.addAttribute("ui.antialias");

// ... calls to graph.addNode(), graph.addEdge() to generate some content

// construct Viewer and ViewPanel (ViewPanel extends JPanel)
Viewer viewer = new Viewer(graph, Viewer.ThreadingModel.GRAPH_IN_GUI_THREAD);
ViewPanel viewPanel = viewer.getDefaultView();

// ViewPanel is added to another JPanel as the latter will include a toolbar later
JPanel panel = new JPanel(new BorderLayout());
panel.add(BorderLayout.CENTER, viewPanel);

// The panel is returned to MPS, which uses the IntelliJ API to
// create respective tool window. This part is not under my control.
// If you think it is relevant please mention it.
return panel;

/编辑:

在进一步研究这个问题时,我发现一定有什么东西触发了错误的行为。一开始一切正常,但过了一段时间后,事情变得奇怪,并继续这样做,直到我重新创建IntelliJ工具窗口。我制作了一个视频短片来说明这一点,请参见YouTube。

我不知道什么可能是“触发器”。我假设有一些竞争条件/线程相关的问题。

共有1个答案

颛孙和悌
2023-03-14

我可以发现,只有在<code>ToolWindowsPane.paintChildren()的上下文中调用graphstream<code>视图面板的<code>paintComponent()</code>时,才会删除图形。在大多数情况下,paintComponent()的调用方式不同(堆栈上的方法较少,尤其是ToolWindowsPane)中的任何方法)。

例如,每次在IntelliJ中的某个地方显示工具提示时,似乎都会调用< code > toolwindowspane . paint children()。因此,规避这个问题的一个卑鄙手段是用重写的< code>paintComponent实现一个自定义的< code>ViewPanel。这很容易,因为graphstream的< code>DefaultView可以扩展。

下面的代码查看调用层次结构,并在必要时发出<code>重绘()。这解决了问题,但导致了额外的渲染工作,但在我的例子中,这似乎不是问题。

public class CustomView extends DefaultView { 

  public CustomView(Viewer viewer, String identifier, GraphRenderer graphRenderer) { 
    super(viewer, identifier, graphRenderer); 
  } 

  @Override 
  public void paintComponent(Graphics g) {  
    StackTraceElement[] stackElements = Thread.currentThread().getStackTrace(); 
    for (int i = 0; i < stackElements.length; i++) { 
      if (stackElements[i].getClassName().equals(ToolWindowsPane.class.getName())) { 
        repaint(); 
        break; 
      } 
    } 
    super.paintComponent(g); 
  } 

}
 类似资料:
  • 问题内容: 我有一个多重图形,我希望能够清楚地看到从一个顶点到另一个顶点的每条边。例如,当我有一个具有2个顶点,从第一个到第二个有2条边的图形时,我希望看到从第一个节点到第二个节点有2条箭头,而不是重叠的箭头。 这是当前的代码,您可以看到我试图将A和B连接起来有2条边: 谢谢你的帮助。 问题答案: 添加系统属性: 资源

  • 我们使用Assertj Swing3.9.2进行的gui单元测试偶尔会以难以重现的方式失败。有时整个测试套件是绿色的,有时一些测试用例失败。我们使用Ubuntu18.04LTS和GNOME两台不同的机器,我们得到了相同的错误。 抛出的异常有两个,并不时出现在不同的测试用例中: null null 此外,在不同的测试用例中,重复运行多次相同的测试可能会导致失败或成功。 特拉维斯-奇的测试也失败了。

  • 问题内容: 您好,我正在创建一个ASP.NET/C#应用程序,我有一个更新面板,该面板需要花费一些时间进行更新。在计算期间,是否可以显示“正在加载…请稍候”消息? 目前,我正在使用AJAX面板动画淡入/淡出,以使面板在计算时消失,然后在完成时重新出现。但这不是很实际。 如果可能,我需要显示一条消息。 感谢您的任何帮助。 这是我的面板的代码: 和Ajax Panel动画扩展器 问题答案: 您可以在以

  • 我需要在Dockerfile中设置默认时区。我有两个容器(nginx和php7 fpm)。 当我进入PHP容器的bash并运行时,我得到: 默认时区= 日期时区= 我的DockerFile如下所示: nginx/Dockerfile: php fpm/Dockerfile: 我试着使用类似问题的答案,但没有结果。 注意:我正在使用和来运行完整的堆栈,这正是这个堆栈。

  • 我意外地发现一个Java进程的stat是T(被作业控制信号停止,或者因为它正在被跟踪)。我想它可能与有关,因为我当时运行了这个命令。然后我再次尝试运行,进程再次崩溃。但这并不容易复制。 有没有人知道为什么进程的stat变成了T而没有杀死-SIGSTOP?jinfo是否存在可能导致进程崩溃的错误? 编辑:我在运行超过60天的过程中100%复制了这个问题。如果进程已运行很长时间,则可能会触发该错误。它

  • 目前,我面临着一个奇怪的问题-当我的页面在浏览器中呈现时,剑道dropDownlist显示其选定的值(选定的id)。你可以在下面的截图中看到它。但是在页面加载完成后,它呈现得非常好。 我们已经参考了这个链接-Kendo DropDownList在加载时在DataTextField之前显示DataValueField,但在这个答案中,他们将在渲染之前隐藏dropdown。我不想要它。我们使用了剑道d