【发布时间】:2017-05-15 14:57:22
【问题描述】:
- 与 Swing JComponent 的所有交互都必须在事件调度线程中完成。也会画画。
- 长任务必须在 Event Dispatch Thread 之外运行,否则会阻塞 GUI。
但是如果长任务是在 Graphics2D 中绘制应用程序,例如 1000 次呢?这是相互矛盾的要求吗?
public class MyObject extends JPanel {
...
public void paintComponent(Graphics g) {...}
...
}
如果我需要多次调用这个方法,这可以被认为是一个漫长的任务,我应该怎么做,以避免阻塞GUI?据我了解,仅将其委托给 SwingWorker 是不允许的。这种“长任务”有什么解决方法吗?
【问题讨论】:
-
你能解释一下为什么要花这么多时间吗?它是否访问数据库?它会调用一个长时间运行的事务吗?另一个问题:为什么它会运行 1000 次?那 1000 次油漆你有多少时间?
-
在paintComponent 方法之外计算所有的数字和形状,所以paintComponent 方法需要做的就是,好吧,绘制。仅绘制一千个对象不太可能影响性能,尤其是在配备现代显卡的机器上。
-
@Tamas Rev 是的,实际上我绘制了我的应用程序 10.000 多次以生成 pdf(只需使用 pdf-g2 调用paintComponent)。我想在执行此操作时显示进度条。
-
painting my appllication 10.000+ times to generate pdfs- 对我来说毫无意义。为什么要重绘 10K 次才能生成 PDF。你是做动画的吗?用户永远不会注意到 PDF 中的 10K 增量更改。如果您正在生成 10K PDF,那么 Swing 与此有什么关系?我猜PDF是在后台生成并保存的。如果您只想更新进度条,则无需自定义绘画。阅读How to Use Progress Bars 上的教程以获取工作示例。 -
@camickr 实际上我正在为庞大的用户群制作个性化的空白。请不要使用“稻草人”这么咄咄逼人和明显。绘制应用程序 10k+ 次可能听起来很奇怪,但仍然是一项可能的任务。
标签: java multithreading swing paintcomponent swingworker