Spec-Zone .ru
спецификации, руководства, описания, API
След: Создание GUI С JFC/Swing
Урок: Использование Других Функций Swing
Как к Windows Create Translucent и Shaped
Домашняя страница > Создание GUI С JFC/Swing > Использование Других Функций Swing

Как к Windows Create Translucent и Shaped

С Платформы Java, Standard Edition 6 (Java SE 6) Обновление 10 выпусков, можно добавить полупрозрачные и имеющие форму окна к своим приложениям Swing. Эта страница затрагивает следующие темы:

Поддерживаемые Возможности

Эта функциональность, которая является частью общедоступного пакета AWT в JDK 7 выпусков, принимает три формы, следующим образом:

Определение Возможностей Платформы

Не все платформы поддерживают все эти возможности. UnsupportedOperationException исключение выдается, когда код пытается вызвать setShape или setOpacity методы на платформе, которая не поддерживает эти возможности. Поэтому, это - передовая практика, чтобы сначала проверить, что платформа поддерживает возможность, которую Вы хотите реализовать. GraphicsDevice class обеспечивает isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency) метод, который можно использовать с этой целью. Вы передаете одно из трех перечислимых значений, определенных в GraphicsDevice.WindowTranslucency, к этому методу: GraphicsConfiguration class также обеспечивает isTranslucencyCapable метод, чтобы определить, если PERPIXEL_TRANSLUCENT полупрозрачность поддерживается данным GraphicsConfiguration объект.

Примечание версии: полупрозрачный и имеющий форму API окна был сначала добавлен к Java SE 6 Обновлений 10 выпусков как частный API. Эта функциональность была перемещена в общедоступный пакет AWT в JDK 7 выпусков. Это учебное руководство описывает API, который доступен в JDK 7 выпусков. См. Java SE 6 Обновлений 10 API для отображения частного API в Java SE 6 Обновлений 10 выпусков к общедоступному API в JDK 7 выпусков.
Следующий код показывает, как проверить на все три возможности:
import static java.awt.GraphicsDevice.WindowTranslucency.*;

// Determine what the default GraphicsDevice can support.
GraphicsEnvironment ge =
    GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();

boolean isUniformTranslucencySupported =
    gd.isWindowTranslucencySupported(TRANSLUCENT);
boolean isPerPixelTranslucencySupported =
    gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);
boolean isShapedWindowSupported =
    gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT);

Отметьте: Ни одна из этих возможностей не работает над окнами в полноэкранном режиме. Вызов любого из соответствующих методов, в то время как в полноэкранном режиме вызывает IllegalComponentStateException исключение, которое будет брошено.

Как Реализовать Универсальную Полупрозрачность

Можно создать окно, где у каждого пикселя есть та же самая полупрозрачность, вызывая setOpacity(float) метод в Window class. float параметр, который передают к этому методу, представляет полупрозрачность окна и должен быть значением между 0 и 1, включительно. Чем меньший число, тем более прозрачный окно. Есть также соответствие getOpacity метод.

TranslucentWindowDemo.java пример создает окно, которое на 55 процентов непрозрачно (полупрозрачных 45 процентов). Если базовая платформа не поддерживает полупрозрачные окна, выходы в качестве примера. Код, касающийся непрозрачности, показывают полужирным.

import java.awt.*;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class TranslucentWindowDemo extends JFrame {
    public TranslucentWindowDemo() {
        super("TranslucentWindow");
        setLayout(new GridBagLayout());

        setSize(300,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Add a sample button.
        add(new JButton("I am a Button"));
    }

    public static void main(String[] args) {
        // Determine if the GraphicsDevice supports translucency.
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();

        //If translucent windows aren't supported, exit.
        if (!gd.isWindowTranslucencySupported(TRANSLUCENT)) {
            System.err.println(
                "Translucency is not supported");
                System.exit(0);
        }
        
        JFrame.setDefaultLookAndFeelDecorated(true);

        // Create the GUI on the event-dispatching thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                TranslucentWindowDemo tw = new TranslucentWindowDemo();

                // Set the window to 55% opaque (45% translucent).
                tw.setOpacity(0.55f);

                // Display the window.
                tw.setVisible(true);
            }
        });
    }
}

Отметьте, что на кнопку также влияет универсальная полупрозрачность. Установка непрозрачности влияет на целое окно, включая любые компоненты, которые содержит окно.

Как Реализовать Полупрозрачность На пиксель

Создание окна, которое использует полупрозрачность на пиксель, включает альфа-значения определения по прямоугольной области, которую занимает окно. Когда альфа-значение пикселя является нулем, тот пиксель полностью прозрачен. Когда альфа-значение пикселя 255, тот пиксель полностью непрозрачен. Когда альфа-значение пикселя 128, тот пиксель на 50 процентов полупрозрачен и так далее. Легкий способ создать гладкую интерполяцию между альфа-значениями состоит в том, чтобы использовать GradientPaint class. Включенный пример использует этот подход.

Вызов setBackground(new Color(0,0,0,0)) на окне заставляет программное обеспечение использовать альфа-значения, чтобы представить полупрозрачность на пиксель. Фактически, вызов setBackground(new Color(0,0,0,alpha), где alpha меньше чем 255, прозрачность установок на пиксель. Так, если Вы вызываете setBackground(new Color(0,0,0,128)) и не сделайте ничего иного, окно представляется с 50-процентной полупрозрачностью для каждого фонового пикселя. Однако, если Вы создадите свой собственный диапазон альфа-значений, то Вы наиболее вероятно будете хотеть альфа-значение 0.

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

Чтобы определить, использует ли окно полупрозрачность на пиксель, можно использовать isOpaque метод.

Пример следует. Во-первых, вот шаги, требуемые реализовывать пример:

  1. Вызвать setBackground(new Color(0,0,0,0)) на окне.
  2. Создайте a JPanel экземпляр, который переопределяет paintComponent метод.
  3. В paintComponent метод, создайте a GradientPaint экземпляр.
  4. В примере у вершины прямоугольника есть альфа-значение 0 (самое прозрачное), и у нижней части есть альфа-значение 255 (самое непрозрачное). GradientPaint class гладко интерполирует альфа-значения от вершины до нижней части прямоугольника.
  5. Установите GradientPaint экземпляр как метод краски панели.

Вот код для GradientTranslucentWindowDemo.java пример. Если базовая платформа не поддерживает полупрозрачность на пиксель, этот пример выходы. Код, определенно касающийся создания окна градиента, показывают полужирным.

import java.awt.*;
import javax.swing.*;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class GradientTranslucentWindowDemo extends JFrame {
    public GradientTranslucentWindowDemo() {
        super("GradientTranslucentWindow");

        setBackground(new Color(0,0,0,0));
        setSize(new Dimension(300,200));
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel panel = new JPanel() {
            @Override
            protected void paintComponent(Graphics g) {
                if (g instanceof Graphics2D) {
                    final int R = 240;
                    final int G = 240;
                    final int B = 240;

                    Paint p =
                        new GradientPaint(0.0f, 0.0f, new Color(R, G, B, 0),
                            0.0f, getHeight(), new Color(R, G, B, 255), true);
                    Graphics2D g2d = (Graphics2D)g;
                    g2d.setPaint(p);
                    g2d.fillRect(0, 0, getWidth(), getHeight());
                }
            }
        };
        setContentPane(panel);
        setLayout(new GridBagLayout());
        add(new JButton("I am a Button"));
    }

    public static void main(String[] args) {
        // Determine what the GraphicsDevice can support.
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        boolean isPerPixelTranslucencySupported = 
            gd.isWindowTranslucencySupported(PERPIXEL_TRANSLUCENT);

        //If translucent windows aren't supported, exit.
        if (!isPerPixelTranslucencySupported) {
            System.out.println(
                "Per-pixel translucency is not supported");
                System.exit(0);
        }

        JFrame.setDefaultLookAndFeelDecorated(true);

        // Create the GUI on the event-dispatching thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                GradientTranslucentWindowDemo gtw = new
                    GradientTranslucentWindowDemo();

                // Display the window.
                gtw.setVisible(true);
            }
        });
    }
}

Отметьте, что на кнопку не влияет полупрозрачность на пиксель. Установка полупрозрачности на пиксель влияет на фоновые пиксели только. Если Вы хотите окно, которое имеет однородно полупрозрачный эффект на фоновые пиксели только, можно вызвать setBackground(new Color(0,0,0,alpha)) где alpha определяет Вашу требуемую полупрозрачность.

Как Реализовать Имеющее форму Окно

Можно создать имеющее форму окно, вызывая setShape(Shape) метод в Window class. Shape параметр, который передают к методу, определяет, как окно отсекается. Когда форма устанавливается на окне, художественные оформления окна не преобразовываются к новой форме, таким образом устанавливая форму работает лучше всего над неукрашенными окнами.

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

ShapedWindowDemo.java пример создает окно овальной формы с 70-процентной непрозрачностью. Если базовая платформа не поддерживает сформированные окна, выходы в качестве примера. Если базовая платформа не поддерживает полупрозрачность, пример использует стандартное непрозрачное окно. Вы могли изменить этот пример, чтобы создать имеющее форму окно, которое также использует полупрозрачность на пиксель.

Код, касающийся формирования окна, показывают полужирным.

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.geom.Ellipse2D;
import static java.awt.GraphicsDevice.WindowTranslucency.*;

public class ShapedWindowDemo extends JFrame {
    public ShapedWindowDemo() {
        super("ShapedWindow");
        setLayout(new GridBagLayout());

        // It is best practice to set the window's shape in
        // the componentResized method.  Then, if the window
        // changes size, the shape will be correctly recalculated.
        addComponentListener(new ComponentAdapter() {
            // Give the window an elliptical shape.
            // If the window is resized, the shape is recalculated here.
            @Override
            public void componentResized(ComponentEvent e) {
                setShape(new Ellipse2D.Double(0,0,getWidth(),getHeight()));
            }
        });

        setUndecorated(true);
        setSize(300,200);
        setLocationRelativeTo(null);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        add(new JButton("I am a Button"));
    }

    public static void main(String[] args) {
        // Determine what the GraphicsDevice can support.
        GraphicsEnvironment ge = 
            GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice gd = ge.getDefaultScreenDevice();
        final boolean isTranslucencySupported = 
            gd.isWindowTranslucencySupported(TRANSLUCENT);

        //If shaped windows aren't supported, exit.
        if (!gd.isWindowTranslucencySupported(PERPIXEL_TRANSPARENT)) {
            System.err.println("Shaped windows are not supported");
            System.exit(0);
        }

        //If translucent windows aren't supported, 
        //create an opaque window.
        if (!isTranslucencySupported) {
            System.out.println(
                "Translucency is not supported, creating an opaque window");
        }

        // Create the GUI on the event-dispatching thread
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {
                ShapedWindowDemo sw = new ShapedWindowDemo();

                // Set the window to 70% translucency, if supported.
                if (isTranslucencySupported) {
                    sw.setOpacity(0.7f);
                }

                // Display the window.
                sw.setVisible(true);
            }
        });
    }
}

Java SE 6 Обновлений 10 API

Изменение общедоступного API в выпуске обновления не позволяется, так, когда полупрозрачная и имеющая форму возможность окон была добавлена к Java SE 6 Обновлений 10 выпусков, это было реализовано в частном com.sun.awt.AWTUtilities class. Для JDK 7 выпусков эта функциональность была перемещена в общедоступный пакет AWT. Следующая таблица показывает, как закрытые методы отображаются на открытые методы.
Метод в Java SE 6 Обновлений 10 JDK 7 Эквивалентов
AWTUtilities.isTranslucencySupported(Translucency) GraphicsDevice.isWindowTranslucencySupported(WindowTranslucency)
AWTUtilities.isTranslucencyCapable(GraphicsConfiguration) GraphicsConfiguration.isTranslucencyCapable()
AWTUtilities.setWindowOpacity(Window, float) Window.setOpacity(float)
AWTUtilities.setWindowShape(Window, Shape) Window.setShape(Shape)
AWTUtilities.setWindowOpaque(boolean) Window.setBackground(Color) Передача new Color(0,0,0,alpha) к этому методу, где alpha меньше чем 255, полупрозрачность установок на пиксель.

Для получения дополнительной информации


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Как Интегрировать с Настольным Классом
Следующая страница: Как Украсить Компоненты Классом JLayer