Java Swing在绘制/渲染时是否阻止UI?
我正在写一个编辑器,我有一些性能问题。问题是,当编辑器Swing块中有大量文本(10K行)时(速度非常慢),UI会变得很慢,因为有很多单词需要高亮显示(重新绘制/重新渲染) 我也在使用EDT(事件调度线程)Java Swing在绘制/渲染时是否阻止UI?,java,swing,Java,Swing,我正在写一个编辑器,我有一些性能问题。问题是,当编辑器Swing块中有大量文本(10K行)时(速度非常慢),UI会变得很慢,因为有很多单词需要高亮显示(重新绘制/重新渲染) 我也在使用EDT(事件调度线程) 绘制/渲染时swing是否会阻止UI?在我向编辑器键入一些单词(如异步绘制等)时,是否有任何方法可以优化渲染?如您所述,请注意始终使用SwingUtilities.invokeLater(Runnable)或SwingUtilities.invokeAndWait(Runnable)调用事件
绘制/渲染时swing是否会阻止UI?在我向编辑器键入一些单词(如异步绘制等)时,是否有任何方法可以优化渲染?如您所述,请注意始终使用
SwingUtilities.invokeLater(Runnable)
或SwingUtilities.invokeAndWait(Runnable)调用事件调度线程上的Swing绘制操作
。否则,您将遇到麻烦,并出现响应问题,最终可能导致所谓的“灰色矩形问题”,即您的帧呈现为灰色矩形,UI不再响应(键盘、鼠标事件等)
invokeLater
和invokeAndWait
之间的区别在于invokeLater
导致传递给它的java.lang.Runnable
在AWT事件调度线程上异步执行。我不知道您如何确保在EDT上完成绘制操作-因此,如果您尚未使用invokeLater
请先尝试一下
除此之外,作为优化UI性能的一般规则:始终尝试最小化必须重新绘制的区域!例如,通过使用java.awt.Component.repain(long tm,int x,int y,int width,int height)
,在指定时间内重新绘制UI组件的特定区域
也许这些链接也有帮助:
您可能希望只显示部分数据,并使用缓存机制控制显示内容。如果有一个关键术语需要搜索,那就是cache和caching更新Swing组件及其模型应该在EDT上完成<代码>用户界面,因为有很多单词需要高亮显示(重新绘制/重新渲染)。-您应该只高亮显示正在更改的文本行。在这种情况下,即使高亮显示是在EDT上完成的,它只影响一条线,而不是10k,并且渲染不会有问题。