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

Нажмите кнопку Launch, чтобы работать, пример TranslucentWindowDemo, используя Сеть Java™ Запускаются. Этот пример требует

Нажмите кнопку Launch, чтобы работать, пример GradientTranslucentWindowDemo, используя
Shape возразите, что можно определить. Имеющие форму окна могут быть непрозрачными, или они могут использовать универсальную форму, или на пиксель, полупрозрачность. Следующий снимок экрана показывает окно овальной формы с 30-процентной полупрозрачностью. 
Нажмите кнопку Launch, чтобы работать, пример ShapedWindowDemo, используя
UnsupportedOperationException исключение выдается, когда код пытается вызвать setShape или setOpacity методы на платформе, которая не поддерживает эти возможности. Поэтому, это - передовая практика, чтобы сначала проверить, что платформа поддерживает возможность, которую Вы хотите реализовать. GraphicsDevice class обеспечивает isWindowTranslucencySupported(GraphicsDevice.WindowTranslucency)GraphicsDevice.WindowTranslucencyTRANSLUCENT – Базовая платформа поддерживает окна с универсальной полупрозрачностью, где у каждого пикселя есть то же самое альфа-значение.PERPIXEL_TRANSLUCENT – Базовая платформа поддерживает окна с полупрозрачностью на пиксель. Эта возможность обязана реализовывать окна, которые исчезают.PERPIXEL_TRANSPARENT – Базовая платформа поддерживает сформированные окна.GraphicsConfiguration class также обеспечивает isTranslucencyCapablePERPIXEL_TRANSLUCENT полупрозрачность поддерживается данным GraphicsConfiguration объект.
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 пример создает окно, которое на 55 процентов непрозрачно (полупрозрачных 45 процентов). Если базовая платформа не поддерживает полупрозрачные окна, выходы в качестве примера. Код, касающийся непрозрачности, показывают полужирным.TranslucentWindowDemo.java
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);
}
});
}
}
Отметьте, что на кнопку также влияет универсальная полупрозрачность. Установка непрозрачности влияет на целое окно, включая любые компоненты, которые содержит окно.
GradientPaintВызов 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
Пример следует. Во-первых, вот шаги, требуемые реализовывать пример:
setBackground(new Color(0,0,0,0)) на окне.JPanel экземпляр, который переопределяет paintComponent метод.paintComponent метод, создайте a GradientPaint экземпляр.GradientPaint class гладко интерполирует альфа-значения от вершины до нижней части прямоугольника.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 метод компонентного слушателя события. Эта практика гарантирует, что форма правильно вычисляется для фактического размера окна. Следующий пример использует этот подход.
пример создает окно овальной формы с 70-процентной непрозрачностью. Если базовая платформа не поддерживает сформированные окна, выходы в качестве примера. Если базовая платформа не поддерживает полупрозрачность, пример использует стандартное непрозрачное окно. Вы могли изменить этот пример, чтобы создать имеющее форму окно, которое также использует полупрозрачность на пиксель.ShapedWindowDemo.java
Код, касающийся формирования окна, показывают полужирным.
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);
}
});
}
}
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, полупрозрачность установок на пиксель. |