如何防止Java框架等待?

如何防止Java框架等待?,java,jframe,redraw,Java,Jframe,Redraw,我正在写一个用多边形近似图像的遗传算法。在经历不同的几代人的过程中,我希望将进度输出到JFrame。然而,JFrame似乎要等到GA的while循环完成后才能显示某些内容。我不认为这是一个像重新绘制一样的问题,因为一旦while循环退出,它最终会显示所有内容。我希望GUI即使在while循环运行时也能动态更新 这是我的密码: while (some conditions) { //do some other stuff gui.displayPolygon(best);

我正在写一个用多边形近似图像的遗传算法。在经历不同的几代人的过程中,我希望将进度输出到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);
}

我认为您的问题是Java不允许您从GUI线程本身以外的其他线程更新GUI。这在某种程度上会给每个人带来悲伤,但幸运的是,提供了一个合理方便的解决方法

其思想是将执行更新的代码作为
Runnable
传递给方法
SwingUtilities.invokeAndWait
SwingUtilities.invokeLater

要以最大速度运行GA并利用并行性,我想
invokeLater
是合适的


编辑:哦,等等,camickr的解决方案提示您正在做其他事情:您正在GUI线程中运行GA。嗯,这只能做一个或另一个,计算或显示。因此,真正的解决方案将结合两种变化:

  • 在单独的线程中运行GA(可以在实例化GUI后在
    main()
    使用的线程中运行GA);及
  • 使用
    invokeLater
    将更新传递给GUI线程(camickr调用EDT或事件调度线程)
  • 然而,它看起来像是JFrame 等待GA的while循环 完成展示某物。我不 相信这是一个像重新粉刷一样的问题

    是的,如果循环代码在EDT上执行,那么GUI在循环完成之前无法重新绘制自身。循环代码应该在自己的线程中执行,这样就不会阻塞EDT


    阅读Swing教程中的部分以了解更多信息。

    这可能是一个重新喷漆前的问题(你为什么不这么认为?)。您应该重写paintComponent方法。与您一样,我仍然倾向于创建一个单独的线程,然后使用invokeLater(),但教程建议使用SwingWorker,它将1和2组合到同一个类中。我想现在大多数人都使用这种方法。这对我来说是个新闻,谢谢!我以前见过SwingWorker,但从来没注意过它。