我正在编写一个编辑器,但遇到一些性能问题。问题是,当编辑器中有大量文本(10K 行)时,Swing 会阻塞 UI(变得非常慢),因为有很多单词需要突出显示(重新绘制/重新渲染)。
我还使用 EDT(事件调度线程)。
绘制/渲染时 Swing 是否会阻塞 UI?当我向编辑器输入一些单词(例如异步绘画等)时,有什么方法可以优化渲染吗?
最佳答案
正如您已经提到的,请务必使用 SwingUtilities.invokeLater(Runnable)
在事件调度线程上调用 Swing 绘制操作。或SwingUtilities.invokeAndWait(Runnable)
。否则,您将陷入麻烦并遇到响应能力问题,最终可能导致所谓的“灰色矩形问题”,其中您的框架呈现为灰色矩形,并且 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/
关于java - Java Swing 在绘画/渲染时是否会阻塞 UI?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52468498/