如何防止Java框架等待?
我正在写一个用多边形近似图像的遗传算法。在经历不同的几代人的过程中,我希望将进度输出到JFrame。然而,JFrame似乎要等到GA的while循环完成后才能显示某些内容。我不认为这是一个像重新绘制一样的问题,因为一旦while循环退出,它最终会显示所有内容。我希望GUI即使在while循环运行时也能动态更新 这是我的密码:如何防止Java框架等待?,java,jframe,redraw,Java,Jframe,Redraw,我正在写一个用多边形近似图像的遗传算法。在经历不同的几代人的过程中,我希望将进度输出到JFrame。然而,JFrame似乎要等到GA的while循环完成后才能显示某些内容。我不认为这是一个像重新绘制一样的问题,因为一旦while循环退出,它最终会显示所有内容。我希望GUI即使在while循环运行时也能动态更新 这是我的密码: while (some conditions) { //do some other stuff gui.displayPolygon(best);
while (some conditions) {
//do some other stuff
gui.displayPolygon(best);
gui.displayFitness(fitness);
gui.setVisible(true);
}
public void displayPolygon(Polygon poly) {
BufferedImage bpoly = ImageProcessor.createImageFromPoly(poly);
ImageProcessor.displayImage(bpoly, polyPanel);
this.setVisible(true);
}
public static void displayImage(BufferedImage bimg, JPanel panel) {
panel.removeAll();
panel.setBounds(0, 0, bimg.getWidth(), bimg.getHeight());
JImagePanel innerPanel = new JImagePanel(bimg, 25, 25);
panel.add(innerPanel);
innerPanel.setLocation(25, 25);
innerPanel.setVisible(true);
panel.setVisible(true);
}
我认为您的问题是Java不允许您从GUI线程本身以外的其他线程更新GUI。这在某种程度上会给每个人带来悲伤,但幸运的是,提供了一个合理方便的解决方法 其思想是将执行更新的代码作为
Runnable
传递给方法SwingUtilities.invokeAndWait
或SwingUtilities.invokeLater
要以最大速度运行GA并利用并行性,我想invokeLater
是合适的
编辑:哦,等等,camickr的解决方案提示您正在做其他事情:您正在GUI线程中运行GA。嗯,这只能做一个或另一个,计算或显示。因此,真正的解决方案将结合两种变化:
main()
使用的线程中运行GA);及invokeLater
将更新传递给GUI线程(camickr调用EDT或事件调度线程)阅读Swing教程中的部分以了解更多信息。这可能是一个重新喷漆前的问题(你为什么不这么认为?)。您应该重写paintComponent方法。与您一样,我仍然倾向于创建一个单独的线程,然后使用invokeLater(),但教程建议使用SwingWorker,它将1和2组合到同一个类中。我想现在大多数人都使用这种方法。这对我来说是个新闻,谢谢!我以前见过SwingWorker,但从来没注意过它。