我有一个带有一些JButton的JPanel。单击JButtons时,将调用事件处理程序。在这个事件处理程序中,我希望能够多次重绘JPanel。在几秒钟内,此事件处理程序中发生了大量处理,我需要能够更新JPanel以向用户显示增量更新。但是,当我在事件处理程序中的JPanel上调用repaint()
时,似乎没有任何事情发生。 JPanel等待重新绘制,直到事件处理程序返回。
我尝试使用repaint(long tm)
方法,但这似乎没有帮助。如何在EDT中多次重新绘制JPanel的行为?
答案 0 :(得分:5)
Swing是单线程的,因此事件处理程序和绘制发生在单个线程(EDT)上。如果您的计算花费时间并尝试在EDT上执行此操作,则不能执行重新绘制(或其他任何操作)。要解决此问题,请在单独的Thread上执行长时间运行的任务,或使用SwingWorker
答案 1 :(得分:3)
大多数类似的问题答案都会告诉您 - 使用SwingWorker执行长时间运行的任务。通过SwingWorker的发布/处理方法将更新推送到GUI,当更新传递到GUI时,重新绘制它。这样你就可以避免踩踏Swing事件线程并避免冻结你的程序。请查看Concurrency in Swing。另请查看this answer to a similar question中的代码。