Добавление JPanel с 86 000 компонентов - PullRequest
0 голосов
/ 08 мая 2019

Так что недавно я нашел Игра жизни Конвея , так что я, естественно, зависим.Мне не потребовалось много времени, чтобы понять, что я сильно ограничен процессором моего компьютера.Я также обнаружил, что по какой-то причине я не могу добавить JPanel со многими JComponents к JFrame.

Итак, у меня есть loop, который добавляет 86,400 JLabels к JPanel, что происходит за ~ 1 секунду, но добавление этого JPanel к JFrame занимает ~ 2 минуты.

Я понимаю, что мог бы использовать java.awt.Graphics, но я бы предпочел использовать JLabels, потому что они автоматически меняют размер.

Итак, мой вопрос: почему это занимает так много времени, чтобы добавить JPanel до JFrame, и как мне это исправить?

1 Ответ

0 голосов
/ 09 мая 2019

Используя java.awt.Graphics, я смог удалить этот длительный период задержки:

public void render(int[][] cells) {

    int cellHeight = image.getHeight() /  cells.length;
    int cellWidth = image.getWidth() /  cells[0].length;

    for (int y = 0; y < cells.length; y++) {
        for (int x = 0; x < cells[y].length; x++) {

            int col = colors[cells[y][x]].getRGB();
            fillSquare(x * (cellWidth), y * (cellHeight), cellWidth, cellHeight, col);
        }
    }
}

// Could pass a java.awt.Rectangle here
private void fillSquare(int xPos, int yPos, int width, int height, int col) {
    for (int y = 0; y < height; y++) {
        for (int x = 0; x < width; x++) {
            pixels[(x + xPos) + (y + yPos) * image.getWidth()] = col;
        }
    }
}

@Override
public void paint(Graphics g) {
    g.drawImage(image, 0, 0, getWidth(), getHeight(), null);
}

Для этого метода важно сохранить размер JFrame, пропорциональный количеству ячеек,таким образом, внутри JFrame.

нет неиспользуемого пространства.
...