Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Swing在绘制/渲染时是否阻止UI?_Java_Swing - Fatal编程技术网

Java Swing在绘制/渲染时是否阻止UI?

Java Swing在绘制/渲染时是否阻止UI?,java,swing,Java,Swing,我正在写一个编辑器,我有一些性能问题。问题是,当编辑器Swing块中有大量文本(10K行)时(速度非常慢),UI会变得很慢,因为有很多单词需要高亮显示(重新绘制/重新渲染) 我也在使用EDT(事件调度线程) 绘制/渲染时swing是否会阻止UI?在我向编辑器键入一些单词(如异步绘制等)时,是否有任何方法可以优化渲染?如您所述,请注意始终使用SwingUtilities.invokeLater(Runnable)或SwingUtilities.invokeAndWait(Runnable)调用事件

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

我也在使用EDT(事件调度线程)


绘制/渲染时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,并且渲染不会有问题。