【发布时间】:2011-02-10 14:52:20
【问题描述】:
是否必须在 EDT(事件调度线程)上调用 java 的 swing print()?
众所周知,在 EDT 上长时间运行的东西需要很长的时间来执行,这很痛苦。
【问题讨论】:
是否必须在 EDT(事件调度线程)上调用 java 的 swing print()?
众所周知,在 EDT 上长时间运行的东西需要很长的时间来执行,这很痛苦。
【问题讨论】:
简短的回答,不,打印不需要在 EDT 上进行。
这在官方教程中有介绍:How to Print Text
交互式或非交互式打印
在交互模式下,在打印期间会显示一个带有中止选项的进度对话框。这是进度对话框的示例。
此对话框允许用户跟踪打印进度。 当在事件调度线程上调用 print 方法时,进度对话框是模态的,否则是非模态的。 重要的是,您的文档在打印时保持不变,否则打印行为是不确定的。 print 方法确保您的文档不会被更改,并在打印期间禁用该组件。
如果你在非交互模式下调用事件派发线程的打印方法,那么包括重绘在内的所有事件都会被阻塞。 这就是为什么仅建议在具有不可见 GUI 的应用程序上以非交互方式在 EDT 上打印的原因。
【讨论】:
请注意,JTextComponent 是唯一可以使用其专用打印方法在后台线程上打印的 Swing 组件。从 JComponent 继承的打印方法是非线程安全的。
一般来说:Swing 是单线程的,除非另有说明。 JTextComponent 的专用打印方法明确声明它是线程安全的:
【讨论】: