Прозрачни прозорци в Java Swing

Ура! От Java 1.7 прозрачните и полупрозрачни прозорци станаха реалност в Java Swing.

В тази статия ще намерите примерен код за създаване на полупрозрачен JFrame. И като бонус можете да видите как хората са били извратени преди появата на тази прекрасна функционалност.

Поддръжката за прозрачност в момента се предлага в 3 форми:

  • равномерна прозрачност (uniform) - всяка точка от прозореца има еднаква стойност на прозрачност - алфа;
  • прозрачност на пиксел (на пиксел) - можете да посочите стойността на непрозрачност за всяка точка. С тази функция можете да правите например градиентни прозорци;
  • Прозрачност, базирана на форма - Можете да създадете прозорец, базиран на форма, като например кръгла форма, и да зададете или плътна цветна прозрачност, или прозрачност на пиксел за него.

Има само един проблем - все още не всички платформи поддържат възможността за рисуване на прозрачни прозорци. Съответно е необходима специална проверка.

Пример за прозрачен JFrame

Предлагам да разгледаме кодов фрагмент за създаване на прозорец с едноцветна прозрачност.

Ако платформата не поддържа прозрачност, тогава UnsupportedOperationException ще бъде хвърлено при опит за извикване на метода setOpacity. За целта беше добавена проверката translucencySupported().

Ето какво се случва в резултат на изпълнение на програмния код:

swing

Емулиране на прозрачност на прозореца в ранните версии на Java

През 2007 г., когато библиотеката Java Swing все още не предоставяше възможност за създаване на прозрачни прозорци без използване на собствен код, попаднах на интересна статия. Той разказва как можете да направите "прозрачни" прозорци в Java Swing без този много естествен код. Това се прави с хитър хак:

  • Правене на екранна снимка предичертеж на прозорец.
  • Нека използваме тази екранна снимка като фон за нашия прозорец.
  • Подреждаме всичко по такъв начин, че реалното изображение на екрана и фона на прозореца да съвпадат - съответно ще се създаде илюзия за прозрачен прозорец.

За да направите екранна снимка на екрана, можете да използвате метода createScreenCapture от класа java.awt.Robot. В статията не ми хареса фразата, че те казват, че всичко е просто, но актуализирането на прозореца, когато прозорецът се промени и премести, е много по-трудно.

Това твърдение беше опровергано буквално за 2 минути.

Беше достатъчно да окачите Listener на обекта JFrame, който ще преначертае фона.

И ето действителния Java код (импортирането на клас е пропуснато):