Влияет ли использование setOpaque(false) на производительность рисования на Swing JComponents?

Мой вопрос заключается в том, влияет ли использование setOpaque(false), которое я использовал с JPanel для макета пользовательского интерфейса в Swing, на производительность рисования больше, чем на сохранение непрозрачности всего (где isOpaque() возвращает true).

Я не очень хорошо знаком с тем, как Swing отображает пользовательский интерфейс, но я предполагаю, что если JComponent не является непрозрачным, будет сложнее отобразить то, что находится за компонентом, чем просто нарисовать непрозрачный фон на компоненте.


person Sammy Guergachi    schedule 01.08.2014    source источник


Ответы (1)


Да, это добавляет дополнительную работу при рисовании, но я сомневаюсь, что вам придется об этом беспокоиться.

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

Так что суть в том, что не беспокойтесь об этом. Если у вас есть причина использовать прозрачность, используйте ее. Если у вас нет причины, то вы не должны использовать его.

Вы можете проверить Фон с прозрачностью. В нем немного подробнее о том, что означает свойство непрозрачности и как оно влияет на рисование, а также о проблемах, которые возникнут, если вы все же используете прозрачный фон.

person camickr    schedule 01.08.2014
comment
В основном это сводится к лени с моей стороны: вписывать ли тот же цвет фона в JPanel, используемый в качестве контейнеров, что и те, которые он содержит, или просто сделать все контейнеры прозрачными. Приятно знать, что я должен больше придерживаться того, чтобы вещи оставались непрозрачными, когда это возможно. - person Sammy Guergachi; 01.08.2014
comment
@SammyGuergachi or just set all containers as transparent., я не вижу в этом большой проблемы. Я бы беспокоился только тогда, когда у вас много анимации, а панель перерисовывается много раз в секунду. Обычно за один раз перекрашивается только один компонент. То есть, когда вы вводите текст в текстовое поле, только текстовое поле перерисовывается, даже если ваша панель прозрачна, это не имеет значения. - person camickr; 01.08.2014
comment
Что ж, в моем случае у меня есть ограничение очень медленных компьютеров, необходимых для запуска этого, а также более конкретное ограничение, заключающееся в том, что у меня есть сотни JPanels в JScrollPane, и я хочу, чтобы все было как можно более плавным, чтобы обеспечить хорошую прокрутку. Я предполагаю, что прокрутка в JScrollPane должна перекрашивать дочерние компоненты, верно? - person Sammy Guergachi; 01.08.2014
comment
@SammyGuergachi, I imagine scrolling in a JScrollPane needs to repaint children panels right? Нет. Еще раз попробуйте, прежде чем предполагать проблему. - person camickr; 01.08.2014