Как сделать прозрачные окна на 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();
               }
          });
     }
}

Реклама

10 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. Рамка украшена, это из за чего может быть?

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

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

Логотип WordPress.com

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

Фотография Twitter

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

Фотография Facebook

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

Google+ photo

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

Connecting to %s

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