当IntelliJ

时间:2017-07-13 16:22:13

标签: swing intellij-idea awt graphstream mps

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

graphstream integrated in MPS

如果面板处于“浮动”模式(未停靠),则可以正常工作(完全类似于独立使用graphstream时,即在JFrame中)。但在“停靠”模式下(如屏幕截图所示)图形在某些情况下会消失,即工具窗口显示空白区域。

我无法重现究竟是什么导致了这个问题,但它似乎与UI有关。有时调整停靠面板的大小或在IntelliJ的一些完全无关的部分显示工具提示会触发“消失”,有时不会。如果再次聚焦(例如,单击空白区域),图形将始终重新出现。

我觉得这是IntelliJ中的一个错误,但是会欣赏如何进一步调查问题的任何想法(我可以在哪里开始调试......)。

代码 - 简短版本:有一个JPanel包含使用DefaultView由graphstream创建的Viewer.getDefaultView()实例。这将移交给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 个答案:

答案 0 :(得分:1)

我可以发现,如果在paintComponent()的上下文中调用了图形流ViewPanel的{​​{1}},则只会删除绘图。在大多数情况下,ToolWindowsPane.paintChildren()的调用方式不同(堆栈中的方法更少,尤其是paintComponent()中的任何方法)。

例如,每次在IntelliJ中的某个地方显示工具提示时,似乎都会调用{p> ToolWindowsPane。因此,解决问题的一个肮脏的黑客是实现自定义的ToolWindowsPane.paintChildren()覆盖ViewPanel。这很简单,因为可以扩展{stream}的paintComponent

以下代码查看调用层次结构,并在必要时发出DefaultView。这解决了这个问题,但会导致额外的渲染工作,但在我的情况下这似乎不是问题。

repaint()