我正在开发一个模拟细胞自动机的应用程序。碰巧我需要快速绘制(每100ms)一个80x80平方(6400平方)的网格。
我的第一种方法是使用JLabels,但速度确实很慢。现在,我正在使用Graphics2D并运行良好,但是绘制大约50次后,它开始变慢,并且随着转弯的前进而变慢。
我需要在每转之后调用repaint()以便“重新绘制”正方形,但是我猜想之前绘制的内容仍在内存中,是吗?我该如何丢弃绘制的内容,以免占用缓冲区或内存?
最后一件事,我看到了这篇文章,但看不到我的和那里提供的代码之间的区别:post about repaint
这是一张图片,可帮助您了解所有内容:
Application running
这是我的代码:
private void drawMatriz(int[][] array, DrawSquare square, int size, AppController contr) {
Color[] configColors = contr.getArrayOfCollors();
int posX = 0;
int posY = 0;
for (int i = 0; i < array.length; i++) {
for (int j = 0; j < array[0].length; j++) {
square.addSquare(posX, posY, size, size, configColors[array[i][j]]);
posX += size;
}
posX = 0;
posY += size;
}
repaint();
}
public AppRun(AppController controller) {
[...]
squares = new DrawSquare();
squares.setBorder(new LineBorder(new Color(0, 0, 0)));
squares.setBounds(209, 11, 640, 640);
getContentPane().add(squares);
squares.setPreferredSize(new Dimension(500, 500));
squares.setLayout(null);
drawMatriz(controller.getVector(), squares, (squares.getBounds().width / controller.getVector().length),
controller);
}
class DrawSquare extends JPanel {
private static final long serialVersionUID = 1L;
private static final int PREF_W = 400;
private static final int PREF_H = PREF_W;
private List<Rectangle> squares = new ArrayList<Rectangle>();
private List<Color> colors = new ArrayList<Color>();
public void addSquare(int x, int y, int width, int height, Color color) {
Rectangle rect = new Rectangle(x, y, width, height);
squares.add(rect);
colors.add(color);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(PREF_W, PREF_H);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
for (int i = 0; i < squares.size(); i++) {
g2.setColor(colors.get(i));
g2.fill(squares.get(i));
g2.setColor(Color.BLACK);
g2.draw(squares.get(i));
}
}
}
最佳答案
我的paintComponent
方法没有任何问题。
但是您似乎永远不会重置ArrayList
类中DrawSquare
的内容,
例如,对它们调用clear()
。
因此,在第一次调用drawMatriz(...)
之后,ArrayList
具有6400个条目,
第二次通话后,他们有12800个条目,50次通话后,它们有320000个条目,...