我正在编写一个编辑器,我有一些性能问题。问题是,当编辑器中有很多文本(10K行)时,Swing会阻塞UI (变得非常慢),因为有很多单词需要突出显示(重新绘制/重新渲染)。
我也使用EDT (Event Dispatch Thread)。
swing在绘制/渲染时会阻塞UI吗?当我在编辑器中输入一些单词(如异步绘制等)时,有没有什么方法可以优化渲染?
发布于 2018-09-24 01:41:50
正如您已经提到的,请注意始终使用SwingUtilities.invokeLater(Runnable)
或SwingUtilities.invokeAndWait(Runnable)
在事件调度线程上调用Swing绘制操作。否则你会遇到麻烦,并且会有响应性问题,最终会导致所谓的“grey - rect -Problem”,即你的框架呈现为灰色矩形,而UI不再响应(键盘、鼠标事件等)。
invokeLater
和invokeAndWait
之间的不同之处在于,invokeLater
会导致您传递给它的java.lang.Runnable
在AWT事件调度线程上异步执行。我不知道您如何确保您的绘画操作是在EDT上完成的-所以如果您还没有使用invokeLater
,请先尝试一下。
除此之外,作为优化UI性能的一般规则:总是尝试最小化必须重新绘制的区域!例如通过使用在指定时间之间重新绘制UI组件的特定区域的java.awt.Component.repaint(long tm, int x, int y, int width, int height)
。
也许这些链接也有帮助:
JTextArea setText(veryLongString) is taking too much time
https://pavelfatin.com/low-latency-painting-in-awt-and-swing/
https://stackoverflow.com/questions/52468498
复制相似问题