Java Swing是否在绘画/渲染时阻止了UI?

时间:2018-09-23 17:17:55

标签: java swing

我正在编写编辑器,但遇到一些性能问题。问题是编辑器中有很多文本(10K行),Swing块(非常慢)UI,因为有很多单词要突出显示(重新绘制/重新渲染)。

我也在使用EDT(事件调度线程)。

绘画/渲染时是否摆动块UI?当我在编辑器中输入一些单词时(例如异步绘画等),有什么方法可以优化渲染?

1 个答案:

答案 0 :(得分:1)

正如您已经提到的,请务必始终使用SwingUtilities.invokeLater(Runnable)SwingUtilities.invokeAndWait(Runnable)事件分配线程上调用Swing绘画操作。否则,您将陷入麻烦并遇到响应问题,最终会导致所谓的“灰色问题”,在该问题中,您的框架呈现为灰色矩形,UI不再响应(键盘,鼠标事件等)。 )。

invokeLaterinvokeAndWait之间的区别在于,invokeLater导致传递给它的java.lang.Runnable在AWT事件分配线程上异步执行。我不知道您如何确保在EDT上完成绘画操作-因此,如果您尚未使用invokeLater,请先尝试一下。

除此之外,作为优化UI性能的一般规则:始终尽量减少必须重新粉刷的区域!例如。通过使用java.awt.Component.repaint(long tm, int x, int y, int width, int height),它可以在指定的时间之间重新绘制UI组件的特定区域。

也许这些链接也有帮助:

JTextArea setText(veryLongString) is taking too much time

https://pavelfatin.com/low-latency-painting-in-awt-and-swing/