我正在开发一个模拟细胞自动机的应用程序。碰巧我需要快速绘制(每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个条目,...

07-24 18:23