Есть несколько вариантов.
Один из методов - использовать два BufferedImages, где вы рисуете один в отдельном потоке, рисуете другой, и переключаетесь, когда рисование завершается (поскольку я предполагаю, чтоснимок время от времени.)
Гораздо лучшим решением будет иметь модель данных, которые могут быть визуализированы напрямую (поскольку данные, которые они хранят, могут быть нарисованы без выполнения каких-либо дополнительных алгоритмических работ с ними).
Это означает, что вы будете выполнять свои алогирмы в отдельном потоке, вычислять значения, которые будут использоваться для рисования, вызывать SwingUtilities.invokeLater для обновления модели.В этом случае модель будет обновляться только в потоке Swing, и при перерисовке у вас будет доступ именно к тем данным, которые нужно нарисовать (и никаких посторонних данных).
Если эти данные все еще настолько велики, что рисуютЭто займет много времени (то есть: если вы рисуете диаграммы с тоннами точек данных), вы отправите, чтобы рассчитать, какие части вашего окна нуждаются в перекраске, и вызовите repaint () только для этого.Эта часть должна быть последним курортом как бы то ни было.99% вашей производительности будет заключаться в перемещении алгоритмов в отдельный поток и предоставлении художнику доступа к данным, которые могут быть визуализированы напрямую.
Если вы посмотрите на рекомендации по обновлению TableModel внешними данными, то у вас естьработа, которая получает данные, возникающие в фоновом потоке (обычно SwingWorker), а затем публикует их в фактической модели с помощью invokeLater () (это значит, что данные не изменяются, пока ваш paint () пытается их прочитать).затем запускает соответствующие события из обновления модели, которые сообщают таблице, какие ячейки изменились.Затем таблица знает, какая часть ее окна просмотра нуждается в перерисовке, и запускает соответствующий метод repaint ().В течение этого времени фоновый поток может продолжить извлечение данных и добавление новых обновлений в очередь событий через invokeLater.