/* * Copyright (c) 2010-2016, Sikuli.org, sikulix.com * Released under the MIT License. * */ package org.sikuli.util; import org.sikuli.basics.Settings; import org.sikuli.basics.Debug; import java.awt.Color; import java.awt.Graphics; import java.awt.Graphics2D; import java.lang.reflect.Method; import javax.swing.JFrame; import javax.swing.JPanel; /** * INTERNAL USE * implements a transparent screen overlay for various purposes */ public class OverlayTransparentWindow extends JFrame implements EventSubject { private JPanel _panel = null; private Color _col = null; private OverlayTransparentWindow _win = null; private Graphics2D _currG2D = null; private EventObserver _obs; public OverlayTransparentWindow() { init(null, null); } public OverlayTransparentWindow(Color col, EventObserver o) { init(col, o); } private void init(Color col, EventObserver o) { setUndecorated(true); setAlwaysOnTop(true); if (col != null) { _obs = o; _win = this; try { setBackground(col); } catch (Exception e) { Debug.error("OverlayTransparentWindow.setBackground: did not work"); } _panel = new javax.swing.JPanel() { @Override protected void paintComponent(Graphics g) { if (g instanceof Graphics2D) { Graphics2D g2d = (Graphics2D) g; _currG2D = g2d; if (Settings.JavaVersion < 7) { g2d.setColor(_col); g2d.fillRect(0, 0, getWidth(), getHeight()); } if (_obs != null) { _obs.update(_win); } } else { super.paintComponent(g); } } }; _panel.setLayout(null); add(_panel); } } @Override public void setOpacity(float alpha) { try { Class<?> c = Class.forName("javax.swing.JFrame"); Method m = c.getMethod("setOpacity", float.class); m.invoke(this, alpha); } catch (Exception e) { Debug.error("OverlayTransparentWindow.setOpacity: did not work"); } } public JPanel getJPanel() { return _panel; } public Graphics2D getJPanelGraphics() { return _currG2D; } @Override public void addObserver(EventObserver o) { _obs = o; } @Override public void notifyObserver() { _obs.update(this); } public void close() { setVisible(false); dispose(); } }