我正在用Java编写一个简单的Game of Life程序,并且让它动起来有点麻烦。我有一个的JComponent类称为LifeDraw,显示像素的网格,具有以下paint方法:使用Java的JComponent repaint()
protected void paintComponent(Graphics g) {
super.paintComponent(g);
for (int y = 0; y < lGrid.getHeight(); y++) {
for (int x = 0; x < lGrid.getWidth(); x++) {
if (lGrid.getCell(x,y) == 1) {
g.setColor(Color.red);
g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize());
} else {
g.setColor(Color.white);
g.fillRect(x * lGrid.getSqSize(), y * lGrid.getSqSize(), lGrid.getSqSize(), lGrid.getSqSize());
}
}
}
}
然后另一个类LifeGrid,有一个方法run()
,其调用时将更新一代像素的网格,然后致电LifeDraw.repaint()
。但是,如果我尝试在循环中调用run()
,那么在循环完成之前,不会重新绘制,因此所有显示的内容都是第一代和最后一个。我想它可能只是更新太快而无法重新绘制,所以我尝试在迭代之间使用Thread.sleep()
,但仍然存在相同的问题。理论上(或者至少我希望是这样),它应该在每次迭代之间重新绘制组件,并显示像素变化的动画。
我不太熟悉Java GUI,所以任何帮助都会非常感激。希望我已经足够清楚地解释了,否则让我知道!
可能与此处的问题相同:http://stackoverflow.com/questions/1843677/why-does-invokelater-cause-my-jframe-not-to-display-correctly – 2010-01-06 21:24:08