如何防止Java Frame等待?

时间:2010-05-02 18:43:32

标签: java jframe redraw

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

2 个答案:

答案 0 :(得分:3)

  

然而,它似乎是JFrame   等到GA的while循环   完成展示的东西。我不   相信这是一个像重新粉刷的问题

是的,如果循环代码在EDT上执行,那么GUI将无法重新绘制,直到循环结束。循环代码应该在自己的Thread中执行,因此它不会阻止EDT。

阅读Concurrency上的Swing教程中的部分以获取更多信息。

答案 1 :(得分:1)

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

我们的想法是将更新的代码作为Runnable传递给方法SwingUtilities.invokeAndWaitSwingUtilities.invokeLaterHere's an example

要以最快的速度运行您的GA并利用并行性,我猜invokeLater是合适的。


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

  1. 在一个单独的线程中运行GA(您可以在实例化GUI后在main()使用的线程中运行它);和
  2. 使用invokeLater将更新传达给GUI线程(camickr调用EDT或事件调度线程)。