Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/307.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 从EDT多次重新绘制JPanel_Java_Swing - Fatal编程技术网

Java 从EDT多次重新绘制JPanel

Java 从EDT多次重新绘制JPanel,java,swing,Java,Swing,我有一个JPanel,上面有一些按钮。单击JButtons时,将调用事件处理程序。在这个事件处理程序中,我希望能够多次重新绘制JPanel。这个事件处理程序在几秒钟内进行了大量处理,我需要能够更新JPanel以向用户显示增量更新。然而,当我在事件处理程序中调用JPanel上的repaint时,似乎什么都没有发生。JPanel等待重新绘制,直到事件处理程序返回 我尝试过使用repaintlong tm方法,但似乎没有帮助。如何从EDT中多次重新绘制JPanel以获得所需的行为?Swing是单线程的

我有一个JPanel,上面有一些按钮。单击JButtons时,将调用事件处理程序。在这个事件处理程序中,我希望能够多次重新绘制JPanel。这个事件处理程序在几秒钟内进行了大量处理,我需要能够更新JPanel以向用户显示增量更新。然而,当我在事件处理程序中调用JPanel上的repaint时,似乎什么都没有发生。JPanel等待重新绘制,直到事件处理程序返回


我尝试过使用repaintlong tm方法,但似乎没有帮助。如何从EDT中多次重新绘制JPanel以获得所需的行为?

Swing是单线程的,因此事件处理程序和绘制在EDT的单线程上进行。如果您的计算需要花费时间,并试图在EDT上进行计算,则无法执行重新绘制或任何其他操作。要克服这一问题,请在单独的服务器上执行长时间运行的任务,或者使用Swing是单线程的,因此事件处理程序和绘制在EDT的单线程上进行。如果您的计算需要花费时间,并试图在EDT上进行计算,则无法执行重新绘制或任何其他操作。要克服这一问题,请单独执行长时间运行的任务,或者使用类似的问题答案告诉您的方法,使用SwingWorker来执行长时间运行的任务。通过SwingWorker的发布/处理方法将更新推送到GUI,当更新传递到GUI时,重新绘制它。这样可以避免在Swing事件线程上跺脚,并避免冻结程序。请退房。还可以查看中的代码。

大多数类似问题的答案都会告诉您-使用SwingWorker来完成长期运行的任务。通过SwingWorker的发布/处理方法将更新推送到GUI,当更新传递到GUI时,重新绘制它。这样可以避免在Swing事件线程上跺脚,并避免冻结程序。请退房。还可以查看我在中的代码