Прозорі вікна в Java Swing
Ура! Починаючи з версії Java 1.7 прозорі та напівпрозорі вікна у Java Swing стали реальністю.
У цій статті ви знайдете приклад коду для створення напівпрозорого JFrame. І як бонус зможете подивитися як перекручувалися люди до появи цієї чудової функціональності.
Підтримка прозорості на даний момент має 3 форми:
- однотонна прозорість (uniform) - кожна точка вікна має те саме значення прозорості - alpha;
- попіксельна прозорість (per-pixel) – можна вказати значення opacity для кожної точки. З цією фічею можна робити, наприклад, градієнтні вікна;
- прозорість на основі форм - можна створити вікно на основі Shape, наприклад, круглої форми, і вказати для нього або однотонну прозорість або попіксельну прозорість.
Є лише одна проблема – поки що не всі платформи підтримують можливість малювання прозорих вікон. Відповідно, потрібна спеціальна перевірка.
Приклад прозорого JFrame
Пропоную розглянути фрагмент коду для створення вікна із однотонною прозорістю.
Якщо платформа не підтримує прозорість, під час спроби виклику методу setOpacity виникне UnsupportedOperationException. Для цього і було додано перевірку translucencySupported().
Ось що вийде в результаті виконання програмного коду:

Емулюємо прозорість вікна на ранніх версіях Java
У далекому 2007 році, коли бібліотека Java Swing ще не надавала можливості створення прозорих вікон без використання native коду, я натрапив на одну цікаву статтю. У ній розповідається, як можна без цього самого нативного коду зробити "прозорі" віконця в Java Swing. Реалізується це за допомогою хитрого хаку:
- Робимо скріншот передпромальовування вікна.
- Використовуємо цей screenshot як background фон для нашого віконця.
- Маємо у своєму розпорядженні всю цю справу так, щоб реальне зображення екрану і фон вікна збігалися - відповідно, створиться ілюзія прозорого вікна.
Для того, щоб зробити скріншот екрану, можна скористатися методом createScreenCapture із класу java.awt.Robot. У статті мені не сподобалася фраза, що, мовляв, це все просто, а от зробити, щоб вікно оновлювалося при зміні та переміщенні вікна - набагато складніше.
Ця заява була спростована буквально через 2 хвилини.
Достатньо було навісити Listener на об'єкт JFrame, який перемальовував би background.
А ось власне і код на Java (імпорт класів опущений):