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.WindowTranslucency
TRANSLUCENT
– Базовая платформа поддерживает окна с универсальной полупрозрачностью, где у каждого пикселя есть то же самое альфа-значение.PERPIXEL_TRANSLUCENT
– Базовая платформа поддерживает окна с полупрозрачностью на пиксель. Эта возможность обязана реализовывать окна, которые исчезают.PERPIXEL_TRANSPARENT
– Базовая платформа поддерживает сформированные окна.GraphicsConfiguration
class также обеспечивает isTranslucencyCapable
PERPIXEL_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, полупрозрачность установок на пиксель. |