Почему мой jscrollpane приводит к нечетным вызовам paint в java swing?

StackOverflow https://stackoverflow.com/questions/566711

Вопрос

У меня есть процедура, которая рисует безумно большой график внутри области прокрутки.Он слишком большой, чтобы рисовать перед добавлением в область прокрутки - для этого потребуется несколько гигабайт.

Из-за размера графика я визуализирую диаграмму в методе paint дочернего элемента scrollpane.Это работает хорошо, однако я замечаю, что каждый раз, когда перемещается полоса прокрутки, моя процедура рисования вызывается дважды - один раз с прямоугольником отсечения, равным прокрученной непокрытой области, и второй раз с прямоугольником отсечения, равным размерам видового экрана.

Например, если мой видовой экран имеет размер 245x195 и я прокручиваю его вниз на 3 пикселя, моя процедура рисования вызывается с g.getClipBounds() установите следующим образом:

java.awt.Rectangle[x=0,y=195,width=245,height=3]
java.awt.Rectangle[x=0,y=3,width=245,height=195]

...поскольку я выполняю рендеринг в программе paint, это вызывает мерцание (я выполняю вычисления так быстро, как только могу, но, я думаю, есть небольшая задержка).Вопросы:

  1. Кто-нибудь знает, как предотвратить 2-й вызов paint? Здесь я делаю простые вещи JScrollPane - у меня есть компонент, я добавляю его в область прокрутки, я добавляю область прокрутки к родительскому компоненту.Вы можете видеть это поведение даже в первой демонстрации прокрутки изображения @ учебное пособие по swing.

  2. Если ответ на вопрос № 1 "нет": кто - нибудь может придумать хороший способ справиться с этим ? Должен ли я рисовать в какой-то буфер изображения, отслеживать последние вызовы рисования и копировать изображение, где это возможно?Я не могу представить, что это будет намного быстрее, чем повторный рендеринг, но любая информация приветствуется :-)

Это было полезно?

Решение

Я столкнулся с этой проблемой в .СЕТЕВОЙ мир.Двойная буферизация должна решить вашу проблему.

Если вы выполняете рендеринг непосредственно на поверхности, которая отображается на экране, у вас нет контроля над тем, когда на самом деле происходит "показ".Что обычно происходит, так это:вы начинаете рендеринг, на экране отображается еще не законченное изображение, вы заканчиваете рендеринг, и затем это, наконец, отображается на экране.

Если вы начнете свою логику рендеринга с изменения цвета фона, то это будет выглядеть как вспышка.Двойная буферизация предотвращает это, потому что она всегда отображается после завершенного рендеринга.Худшее, что может случиться, - это небольшое "разрывание", но это заметно только при быстро меняющейся анимации.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top