我正在编写编辑器,但遇到一些性能问题。问题是编辑器中有很多文本(10K行),Swing块(非常慢)UI,因为有很多单词要突出显示(重新绘制/重新渲染)。
我也在使用EDT(事件调度线程)。
绘画/渲染时是否摆动块UI?当我在编辑器中输入一些单词时(例如异步绘画等),有什么方法可以优化渲染?
答案 0 :(得分:1)
正如您已经提到的,请务必始终使用SwingUtilities.invokeLater(Runnable)
或SwingUtilities.invokeAndWait(Runnable)
在事件分配线程上调用Swing绘画操作。否则,您将陷入麻烦并遇到响应问题,最终会导致所谓的“灰色问题”,在该问题中,您的框架呈现为灰色矩形,UI不再响应(键盘,鼠标事件等)。 )。
invokeLater
与invokeAndWait
之间的区别在于,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/