Короткий ответ на ваш вопрос заключается в том, что «непрозрачный» на английском языке определяется как полностью непрозрачный. Поэтому непрозрачный компонент - это тот, который закрашивает весь прямоугольник, и каждый пиксель вовсе не является прозрачным.
Тем не менее, API непрозрачности компонента Swing - это один из тех неправильно разработанных и, следовательно, часто неправильно используемых API.
Важно понимать, что isOpaque
- это контракт между системой Swing и конкретным компонентом. Если он возвращает true, компонент гарантирует непрозрачную прорисовку каждого пикселя своей прямоугольной области. Этот API должен быть абстрактным, чтобы все авторы компонентов могли его рассмотреть. API isOpaque
используется системой рисования Swing для определения того, должна ли область, покрываемая данным компонентом, быть окрашенной для компонентов, которые перекрывают его и которые находятся за ним , включая компоненты Тара и предки. Если компонент возвращает true для этого API, система Swing может оптимизировать рисование, чтобы ничего не рисовать в этой области, пока не будет вызван метод рисования конкретного компонента.
Из-за договорного значения isOpaque
API setOpaque
не должен существовать , поскольку для любого внешнего вызова действительно неправильно вызывать setOpaque
, поскольку, в свою очередь, внешняя вещь может ' не знаю, будет ли рассматриваемый компонент (или даже может) соблюдать его. Вместо этого isOpaque должен был быть переопределен каждым конкретным компонентом, чтобы возвращать, является ли он фактически непрозрачным, учитывая его текущие свойства.
Поскольку setOpaque
API действительно существует, многие компоненты неправильно реализовали его (вполне понятно), чтобы определить, будут ли они рисовать свой "фон" (например, JLabel и JPanel, заполняющие их фоновый цвет). В результате у пользователей API создается впечатление, что setOpaque
управляет диском, должен ли этот фон рисовать, но это не так.
Кроме того, если, скажем, вы хотите нарисовать JLabel с полупрозрачным фоном, вам нужно установить цвет фона с альфа-значением и сделать setOpaque (true), но это не совсем непрозрачно - это полупрозрачный ; Компоненты, стоящие за ним, все еще должны рисовать, чтобы компонент правильно отображался.
Эта проблема была раскрыта в значительной степени с новым Nimbus Look & Feel в Java 6. Существует множество сообщений об ошибках, связанных с прозрачными компонентами, поданными против Nimbus (см. Вопрос о переполнении стека Java Nimbus LAF с прозрачными текстовыми полями ). Ответ команды разработчиков Nimbus таков:
Это проблема [оригинального] дизайна Swing и его запутанности в течение многих лет. Проблема в том, что setOpaque (false) имеет [побочный эффект] в [существующих] LAF, а именно в скрытии фона, который на самом деле не предназначен для [предназначенного]. [Подразумевается], что компонент может иметь прозрачные части, и [Swing] должен закрасить родительский компонент за ним.
Итак, в итоге, вы не должны использовать setOpaque
. Если вы используете его, имейте в виду, что комбинация некоторых Look & Feels и некоторых компонентов может сделать «удивительные» вещи. И, в конце концов, на самом деле нет правильного ответа.