Я делаю нечто очень похожее в частном проекте, над которым я работаю. До сих пор я генерировал изображения размером до 1024x1024 без каких-либо проблем (кроме памяти) и могу отображать их очень быстро и без проблем с производительностью.
Переопределение метода рисования подкласса JPanel является излишним и требует больше работы, чем нужно.
Как я это делаю:
Class MapIcon implements Icon {...}
OR
Class MapIcon extends ImageIcon {...}
Код, который вы используете для создания изображения, будет в этом классе. Я использую BufferedImage, чтобы рисовать тогда, когда вызывается paintIcon (), используйте g.drawImvge (bufferedImage); Это уменьшает количество перепрошивок, которые вы выполняете во время создания изображений, и вы можете их обработать.
Далее я расширяю JLabel:
Class MapLabel extends Scrollable, MouseMotionListener {...}
Это потому, что я хочу поместить свое изображение в область прокрутки, т.е. отобразить часть изображения и заставить пользователя прокручивать по мере необходимости.
Итак, я использую JScrollPane для хранения MapLabel, который содержит только MapIcon.
MapIcon map = new MapIcon ();
MapLabel mapLabel = new MapLabel (map);
JScrollPane scrollPane = new JScrollPane();
scrollPane.getViewport ().add (mapLabel);
Но для вашего сценария (просто показывайте изображение целиком каждый раз). Вам необходимо добавить MapLabel в верхнюю JPanel и убедиться, что все их размеры соответствуют полному размеру изображения (переопределив GetPreferredSize ()).