Как сделать прозрачные окна на java

Недавно в комментах мне написали следующее "Напиши про прозрачные окна в ява, думаю многим будет интересно. Вот ссылки:
1. http://www.pushing-pixels.org/?p=260
2. http://weblogs.java.net/blog/joshy/archive/2008/06/java_doodle_fad.html". Пробую.

Для того, чтобы воспользоваться такой прелестью нужно поставить JDK посвежее. Точно не знаю, с какой именно версии началась поддержка прозрачности. Лично я скачал сразу JDK 6 update 16. Здесь точно поддерживается.

Теперь посмотрим, что нужно сделать, чтобы установить прозрачность у JFrame. Все очень просто. Есть такой класс AWTUtilities в пакете com.sun.awt.*. У этого класса есть такой метод setWindowOpacity. Первым параметром методу передается объект Window, у которого мы хотим установить требуемую прозрачность. Второй параметр метода — это float значение прозрачности, которую хотим мы установить для окна.

AWTUtilities.setWindowOpacity(frame, 0.5f);

Кроме метода setWindowOpacity в классе AWTUtilities есть другие интересные методы, которую я думаю рассмотрю позже.

По традиции тестовое приложение.

jframe_translucency

Снимок окошка JFrame специально делал на неоднородном фоне, чтобы была видна прозрачность.


import com.sun.awt.AWTUtilities;

import java.awt.*;
import javax.swing.*;

public class TestFrame extends JFrame {

     public static void createGUI() {
          JFrame frame = new JFrame("Test frame");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

          String html = "<html>The Java Tutorials are practical guides "
                    + "for programmers who want to use the Java programming "
                    + "language to create applications. They include hundreds "
                    + "of complete, working examples, and dozens of lessons. "
                    + "Groups of related lessons are organized into \"trails.\" "
                    + "The Java Tutorials include features through the Java SE 6 version. "
                    + "Selected tutorials have been printed; see the Related "
                    + "Resources box to the right.</html>";

          JLabel label = new JLabel(html);

          frame.getContentPane().add(label);

          frame.setPreferredSize(new Dimension(250, 230));
          frame.pack();
          frame.setLocationRelativeTo(null);
          frame.setVisible(true);

          AWTUtilities.setWindowOpacity(frame, 0.5f);
     }

     public static void main(String[] args) {
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
               public void run() {
                    JFrame.setDefaultLookAndFeelDecorated(true);
                    createGUI();
               }
          });
     }
}

Реклама

11 Responses to Как сделать прозрачные окна на java

  1. cyper_ says:

    Думаю, с точки зрения поисковой оптимизации, было бы лучше назвать статью «Как сделать прозрачные окна на java» или что то типа такого.
    И почему ты используешь этот тупой стиль Motif ?!!!
    Установи другой стиль:
    Пропиши заместь JFrame.setDefaultLookAndFeelDecorated(true); один из:

    UIManager.setLookAndFeel(«com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel»);
    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());

    А так статья пойдет…

  2. bondforever says:

    Да вроде и Motif не такой уж и отвратный. Окошко еще он сам рисует — весь GUI в одном стиле получается, а у нимбуса окошка нет своего по-моему.

  3. dream-x says:

    Интересно. А с какой версии java появился этот класс AWTUtilities? Просто вроде год назад когда я пытался что-то подобное сотворить использовал Robot помещал изображение на JFrame и т.д. Вот на счет l&f нравиться вам Motif и испоьзуйте его.
    Вот исходный по которому я делал http://onjava.com/pub/a/onjava/excerpt/swinghks_hack41/index.html?CMP=OTC-FP2116136014

    • bondforever says:

      Нашел вот здесь вот такие слова: «One of the major features introduced in the Java SE 6u10 release is the ability to create translucent and shaped windows». Типо одной из главных особенностей, которая была представлена в Java SE 6 u10 (update 10) это возможность создавать прозрычные окна и «shaped» окна (можно задавать форму). Думаю, что с 10-го updat’а прозрачность начала поддерживаться.

  4. cyper says:

    Обнаружил что прозрачность не поддерживается в линуксе.
    Система:
    Linux Mint 8
    java version «1.6.0_15»
    Java(TM) SE Runtime Environment (build 1.6.0_15-b03)
    Java HotSpot(TM) Client VM (build 14.1-b02, mixed mode, sharing)

    Исключение:
    Exception in thread «main» java.lang.UnsupportedOperationException: The TRANSLUCENT translucency kind is not supported.
    at com.sun.awt.AWTUtilities.setWindowOpacity(AWTUtilities.java:166)

  5. sandlex says:

    Сань, чтобы при потере фокуса не мерцал черный прямоугольник нужно где-нибудь указать AWTUtilities.setWindowOpaque(window, false).

    Типа:
    private void initComponents() {
    setPreferredSize(DEFAULT_SIZE);
    AWTUtilities.setWindowOpaque(this, false);

    }

    А далее методы, которые срабатывают при событиях мыши:
    private void makeTransparent() {
    AWTUtilities.setWindowOpacity(this, 0.5f);
    }

    private void makeOpaque() {
    AWTUtilities.setWindowOpacity(this, 1f);
    }

  6. Man Lee says:

    Интересно, а есть ли возможность сделать прозрачным например JWindow а компоненты размещённые на нём (всякие JButton-ы) оставить НЕ прозрачными ????

  7. Igor says:

    Ни Линуха ни Мак не поддерживают на сегодняшний день AWTUtilites, а именно то что здесь перечисленно: http://java.sun.com/developer/technicalArticles/GUI/translucent_shaped_windows/, вот такой вот кросс платформ, при чем что только на Убунте не колдовал, все бестолку)))))

  8. Alexey says:

    выдает ошибку The frame is decorated. Рамка украшена, это из за чего может быть?

  9. Евгений says:

    почему все программисты, которые показывают как писать окна на яве, всегда используют какие-то мудрёные навороченные способы? то вон тут отдельный статический метод вместе с потоком, у другого вообще в двух файлах куча наворотов, ещё видел жесть всякую. ребята, когда программисты перестанут выделываться кто сложнее напишет программу, неужели понты это обязательный атрибут программиста.

Добавить комментарий

Заполните поля или щелкните по значку, чтобы оставить свой комментарий:

Логотип WordPress.com

Для комментария используется ваша учётная запись WordPress.com. Выход / Изменить )

Фотография Twitter

Для комментария используется ваша учётная запись Twitter. Выход / Изменить )

Фотография Facebook

Для комментария используется ваша учётная запись Facebook. Выход / Изменить )

Google+ photo

Для комментария используется ваша учётная запись Google+. Выход / Изменить )

Connecting to %s

%d такие блоггеры, как: