java - Java Swing 在绘画/渲染时是否会阻塞 UI?

标签 java swing

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

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

绘制/渲染时 Swing 是否会阻塞 UI?当我向编辑器输入一些单词(例如异步绘画等)时,有什么方法可以优化渲染吗?

最佳答案

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

invokeLater 之间的差异和invokeAndWaitinvokeLater导致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/

相关文章:

Java:避免写入和读取文件

java - 什么时候适合用 volatile 成员替换 AtomicReference?

Java String.split 方法不能很好地工作

java - 如何去掉JMenu和JMenuItems中的白边

java - 切换顶级窗口时如何使主机保持在对话框后面?

java - Java 8 Swing 中有列表 GUI 组件吗?

java - JTextPane 中的 Swingx 搜索

java - 如何改变 JTextArea 中只有一个字符串的大小?

java - Eclipse 无法识别 com.sun.net.httpserver.HttpServer 包

java - JTable 在 JFrame 的(单独的类)JTextfield 中显示选定的行数据