我正在编写一个近似于多边形图像的遗传算法。在经历不同代的过程中,我想将进度输出到JFrame。然而,似乎JFrame等待GA的while循环结束以显示某些内容。我不相信这是一个像重新绘制的问题,因为它最终会在while循环退出时显示所有内容。我希望GUI即使在while循环运行时也能动态更新。
这是我的代码:
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);
}
答案 0 :(得分:3)
然而,它似乎是JFrame 等到GA的while循环 完成展示的东西。我不 相信这是一个像重新粉刷的问题
是的,如果循环代码在EDT上执行,那么GUI将无法重新绘制,直到循环结束。循环代码应该在自己的Thread中执行,因此它不会阻止EDT。
阅读Concurrency上的Swing教程中的部分以获取更多信息。
答案 1 :(得分:1)
我认为您的问题是Java不允许您从GUI线程本身以外的其他线程更新GUI。这会在某些时候给每个人带来悲伤,但幸运的是提供了一个相当方便的解决方法。
我们的想法是将更新的代码作为Runnable
传递给方法SwingUtilities.invokeAndWait
或SwingUtilities.invokeLater
。 Here's an example
要以最快的速度运行您的GA并利用并行性,我猜invokeLater
是合适的。
编辑:哦等等,camickr的解决方案暗示你正在做其他事情:你在GUI的线程中运行GA。那么,只能做一个或另一个,计算或显示。因此,真正的解决方案将结合两种变化:
main()
使用的线程中运行它);和invokeLater
将更新传达给GUI线程(camickr调用EDT或事件调度线程)。