(истинный/ложный) setOpaque; Java

В Java2D, когда Вы используете setOpaque, я немного смущен на том, что делает истина и ложь.

Например, я знаю, что в Непрозрачном Swing означает, что при рисовании привычки Swing красят то, что находится позади компонента. Или это назад? Какой - это?

Спасибо

12
задан 25 June 2010 в 22:24
поделиться

2 ответа

Короткий ответ на ваш вопрос заключается в том, что "непрозрачный" определяется в английском языке как полностью непрозрачный. Поэтому непрозрачный компонент - это компонент, который закрашивает весь прямоугольник, и каждый пиксель ни в какой степени не является полупрозрачным.

Однако API непрозрачности компонентов Swing - один из тех неправильно разработанных и поэтому часто неправильно используемых API.

Важно понять, что isOpaque - это контракт между системой Swing и конкретным компонентом. Если он возвращает true, компонент гарантирует, что каждый пиксель его прямоугольной области будет непрозрачно окрашен. Этот API должен быть абстрактным, чтобы заставить всех авторов компонентов учитывать его. API isOpaque используется системой рисования Swing для определения того, должна ли область, покрываемая данным компонентом, быть закрашена для компонентов, которые перекрывают его и находятся за ним, включая контейнер и предков компонента. Если компонент возвращает true в этом API, система Swing может оптимизировать рисование, чтобы не рисовать ничего в этой области до вызова метода paint конкретного компонента.

Из-за договорных последствий isOpaque, API setOpaque не должен существовать, поскольку это фактически неправильно для чего-либо внешнего вызывать setOpaque, поскольку, в свою очередь, внешняя вещь не может знать, будет ли (или даже может ли) данный компонент выполнять это. Вместо этого, isOpaque должен был переопределяться каждым конкретным компонентом, чтобы возвращать, является ли он на самом деле непрозрачным, учитывая его текущие свойства.

Поскольку API setOpaque существует, многие компоненты неправильно реализовали его (вполне понятно), чтобы управлять тем, будут ли они красить свой "фон" (например, JLabel и JPanel заполняются своим фоновым цветом). В результате этого у пользователей API создается впечатление, что setOpaque определяет, будет ли фон окрашиваться, но это не так.

Более того, если, скажем, вы хотите нарисовать JLabel с полупрозрачным фоном, вам нужно установить цвет фона с альфа-значением и сделать setOpaque(true), но на самом деле он не является непрозрачным - он полупрозрачный; компоненты за ним все равно должны быть окрашены, чтобы компонент отображался правильно.

Эта проблема в значительной степени проявилась в Java 6 с новым Nimbus Look & Feel. На Nimbus было подано множество сообщений об ошибках, связанных с прозрачными компонентами (см. вопрос stack overflow Java Nimbus LAF с прозрачными текстовыми полями). Ответ команды разработчиков Nimbus таков:

Это проблема [в] оригинальном дизайне Swing и в том, как он был запутан в течение многих лет. Проблема в том, что setOpaque(false) имеет побочный эффект в [существующих] LAF, который заключается в скрытии фона, что на самом деле не является тем, для чего он [предназначен]. Она [предназначена] для того, чтобы сказать, что компонент может иметь прозрачные части и [Swing] должен рисовать родительский компонент за ним.

Итак, в целом, вам не следует использовать setOpaque. Если вы все же используете его, имейте в виду, что комбинация некоторых Look & Feels и некоторых компонентов может делать "удивительные" вещи. И, в конце концов, на самом деле нет правильного ответа.

48
ответ дан 2 December 2019 в 03:11
поделиться

javadoc говорит: Если true, компонент закрашивает каждый пиксель в пределах своих границ. В противном случае компонент может не закрасить некоторые или все свои пиксели , позволяя просвечивать нижележащие пиксели.

попробуйте и этот пример программы ... http://www.java2s.com/Code/JavaAPI/javax.swing/JPanelsetOpaquebooleanisOpaque.htm

1
ответ дан 2 December 2019 в 03:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: