<?xml version="1.0" encoding="UTF-8"?><!-- generator="wordpress/2.2.1" -->
<rss version="2.0" 
	xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
	<title>Comments on: Прозрачные окна в Java Swing (transparent windows)</title>
	<link>http://www.javenue.info/post/66</link>
	<description>Блог разработчика о Java и родственных технологиях</description>
	<pubDate>Fri, 21 Nov 2008 08:01:23 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.2.1</generator>

	<item>
		<title>By: Balabas</title>
		<link>http://www.javenue.info/post/66#comment-21594</link>
		<author>Balabas</author>
		<pubDate>Wed, 20 Feb 2008 15:03:37 +0000</pubDate>
		<guid>http://www.javenue.info/post/66#comment-21594</guid>
		<description>Прикольно. Только дёрганое немного окошко и когда деактивируется, становится непрозрачным, хотя :
[qoute]
public void windowDeactivated(WindowEvent e) {
updateBackground();
frame.repaint();
[/qoute]
????</description>
		<content:encoded><![CDATA[<p>Прикольно. Только дёрганое немного окошко и когда деактивируется, становится непрозрачным, хотя :<br />
[qoute]<br />
public void windowDeactivated(WindowEvent e) {<br />
updateBackground();<br />
frame.repaint();<br />
[/qoute]<br />
????</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Stas</title>
		<link>http://www.javenue.info/post/66#comment-20915</link>
		<author>Stas</author>
		<pubDate>Sun, 27 Jan 2008 19:56:18 +0000</pubDate>
		<guid>http://www.javenue.info/post/66#comment-20915</guid>
		<description>А еще это окно "видит" неактивные окна как активные, подменяет элементы интерфейса окон на стандартные Windows и делает из белого текста черный (некоторые скрытые Label'и). Может есть еще какой-нибудь метод для снятия скринов с экрана?</description>
		<content:encoded><![CDATA[<p>А еще это окно &#8220;видит&#8221; неактивные окна как активные, подменяет элементы интерфейса окон на стандартные Windows и делает из белого текста черный (некоторые скрытые Label&#8217;и). Может есть еще какой-нибудь метод для снятия скринов с экрана?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Ivan Kotenko</title>
		<link>http://www.javenue.info/post/66#comment-19651</link>
		<author>Ivan Kotenko</author>
		<pubDate>Tue, 13 Nov 2007 16:50:24 +0000</pubDate>
		<guid>http://www.javenue.info/post/66#comment-19651</guid>
		<description>Попытался сделать получше...
Получилось конечно кривовато, но получше. 
Теперь окно совсем не видно, а перетаскивается за любую часть.
Исправлен баг с тем отображением фона, который сохранился при первом открытии.
Но остался баг. Если открыть программу, а затем свернуть окно находящееся за ним, то программа перерисует фон только при активизации ее фрейма.


&lt;code&gt;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;

import javax.swing.*;

public class TransparentBackground extends JComponent implements
		MouseMotionListener, MouseListener, ComponentListener, WindowListener {
	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;

	private JFrame frame;

	private int x, y;

	private Image background;

	public TransparentBackground(JFrame frame) {
		this.frame = frame;
		frame.addWindowListener(this);
		addMouseMotionListener(this);
		addMouseListener(this);
		updateBackground();
	}

	public void updateBackground() {
		try {
			Dimension frameDim = frame.getSize();
			frame.setSize(0, 0);
			Robot rbt = new Robot();
			Toolkit tk = Toolkit.getDefaultToolkit();
			Dimension dim = tk.getScreenSize();

			background = rbt.createScreenCapture(new Rectangle(0, 0, (int) dim
					.getWidth(), (int) dim.getHeight()));
			frame.setSize(frameDim);
		} catch (Exception ex) {
			ex.printStackTrace();
		}
	}

	public void paintComponent(Graphics g) {
		Point pos = this.getLocationOnScreen();
		Point offset = new Point(-pos.x, -pos.y);
		g.drawImage(background, offset.x, offset.y, null);
	}

	public void componentResized(ComponentEvent e) {
		Component[] components = ((JFrame) e.getComponent()).getContentPane()
				.getComponents();
		if (components.length &#62; 0)
			components[0].repaint();
	}

	public void componentMoved(ComponentEvent e) {
		componentResized(e);
	}

	public void componentShown(ComponentEvent e) {
		componentResized(e);
	}

	public void componentHidden(ComponentEvent e) {
		componentResized(e);

	}

	public static void main(String[] args) {
		final JFrame frame = new JFrame("Transparent Window");
		frame.setUndecorated(true);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JButton button = new JButton("This is a button");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				frame.dispose();
			}
		});
		TransparentBackground bg = new TransparentBackground(frame);

		bg.setLayout(new BorderLayout());
		bg.add("North", button);
		JLabel label = new JLabel("This is a label");
		bg.add("South", label);
		frame.getContentPane().add("Center", bg);
		frame.setSize(200, 200);

		frame.setVisible(true);
	}

	public void mouseDragged(MouseEvent e) {
		frame.setLocation(e.getX() + frame.getX() - x, e.getY() + frame.getY()
				- y);
		frame.repaint();
	}

	public void mouseMoved(MouseEvent e) {
	}

	public void mouseClicked(MouseEvent e) {

	}

	public void mouseEntered(MouseEvent e) {
	}

	public void mouseExited(MouseEvent e) {
	}

	public void mousePressed(MouseEvent e) {
		x = e.getX();
		y = e.getY();
	}

	public void mouseReleased(MouseEvent e) {
	}

	public void windowActivated(WindowEvent e) {
		updateBackground();
		frame.repaint();
	}

	public void windowClosed(WindowEvent e) {}

	public void windowClosing(WindowEvent e) {}

	public void windowDeactivated(WindowEvent e) {
		updateBackground();
		frame.repaint();
	}

	public void windowDeiconified(WindowEvent e) {}

	public void windowIconified(WindowEvent e) {}

	public void windowOpened(WindowEvent e) {}
}
&lt;/code&gt;</description>
		<content:encoded><![CDATA[<p>Попытался сделать получше&#8230;<br />
Получилось конечно кривовато, но получше.<br />
Теперь окно совсем не видно, а перетаскивается за любую часть.<br />
Исправлен баг с тем отображением фона, который сохранился при первом открытии.<br />
Но остался баг. Если открыть программу, а затем свернуть окно находящееся за ним, то программа перерисует фон только при активизации ее фрейма.</p>
<p><code><br />
import java.awt.*;<br />
import java.awt.event.ActionEvent;<br />
import java.awt.event.ActionListener;<br />
import java.awt.event.ComponentEvent;<br />
import java.awt.event.ComponentListener;<br />
import java.awt.event.MouseEvent;<br />
import java.awt.event.MouseListener;<br />
import java.awt.event.MouseMotionListener;<br />
import java.awt.event.WindowEvent;<br />
import java.awt.event.WindowListener;</p>
<p>import javax.swing.*;</p>
<p>public class TransparentBackground extends JComponent implements<br />
		MouseMotionListener, MouseListener, ComponentListener, WindowListener {<br />
	/**<br />
	 *<br />
	 */<br />
	private static final long serialVersionUID = 1L;</p>
<p>	private JFrame frame;</p>
<p>	private int x, y;</p>
<p>	private Image background;</p>
<p>	public TransparentBackground(JFrame frame) {<br />
		this.frame = frame;<br />
		frame.addWindowListener(this);<br />
		addMouseMotionListener(this);<br />
		addMouseListener(this);<br />
		updateBackground();<br />
	}</p>
<p>	public void updateBackground() {<br />
		try {<br />
			Dimension frameDim = frame.getSize();<br />
			frame.setSize(0, 0);<br />
			Robot rbt = new Robot();<br />
			Toolkit tk = Toolkit.getDefaultToolkit();<br />
			Dimension dim = tk.getScreenSize();</p>
<p>			background = rbt.createScreenCapture(new Rectangle(0, 0, (int) dim<br />
					.getWidth(), (int) dim.getHeight()));<br />
			frame.setSize(frameDim);<br />
		} catch (Exception ex) {<br />
			ex.printStackTrace();<br />
		}<br />
	}</p>
<p>	public void paintComponent(Graphics g) {<br />
		Point pos = this.getLocationOnScreen();<br />
		Point offset = new Point(-pos.x, -pos.y);<br />
		g.drawImage(background, offset.x, offset.y, null);<br />
	}</p>
<p>	public void componentResized(ComponentEvent e) {<br />
		Component[] components = ((JFrame) e.getComponent()).getContentPane()<br />
				.getComponents();<br />
		if (components.length &gt; 0)<br />
			components[0].repaint();<br />
	}</p>
<p>	public void componentMoved(ComponentEvent e) {<br />
		componentResized(e);<br />
	}</p>
<p>	public void componentShown(ComponentEvent e) {<br />
		componentResized(e);<br />
	}</p>
<p>	public void componentHidden(ComponentEvent e) {<br />
		componentResized(e);</p>
<p>	}</p>
<p>	public static void main(String[] args) {<br />
		final JFrame frame = new JFrame("Transparent Window");<br />
		frame.setUndecorated(true);<br />
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);<br />
		JButton button = new JButton("This is a button");<br />
		button.addActionListener(new ActionListener() {<br />
			public void actionPerformed(ActionEvent e) {<br />
				frame.dispose();<br />
			}<br />
		});<br />
		TransparentBackground bg = new TransparentBackground(frame);</p>
<p>		bg.setLayout(new BorderLayout());<br />
		bg.add("North", button);<br />
		JLabel label = new JLabel("This is a label");<br />
		bg.add("South", label);<br />
		frame.getContentPane().add("Center", bg);<br />
		frame.setSize(200, 200);</p>
<p>		frame.setVisible(true);<br />
	}</p>
<p>	public void mouseDragged(MouseEvent e) {<br />
		frame.setLocation(e.getX() + frame.getX() - x, e.getY() + frame.getY()<br />
				- y);<br />
		frame.repaint();<br />
	}</p>
<p>	public void mouseMoved(MouseEvent e) {<br />
	}</p>
<p>	public void mouseClicked(MouseEvent e) {</p>
<p>	}</p>
<p>	public void mouseEntered(MouseEvent e) {<br />
	}</p>
<p>	public void mouseExited(MouseEvent e) {<br />
	}</p>
<p>	public void mousePressed(MouseEvent e) {<br />
		x = e.getX();<br />
		y = e.getY();<br />
	}</p>
<p>	public void mouseReleased(MouseEvent e) {<br />
	}</p>
<p>	public void windowActivated(WindowEvent e) {<br />
		updateBackground();<br />
		frame.repaint();<br />
	}</p>
<p>	public void windowClosed(WindowEvent e) {}</p>
<p>	public void windowClosing(WindowEvent e) {}</p>
<p>	public void windowDeactivated(WindowEvent e) {<br />
		updateBackground();<br />
		frame.repaint();<br />
	}</p>
<p>	public void windowDeiconified(WindowEvent e) {}</p>
<p>	public void windowIconified(WindowEvent e) {}</p>
<p>	public void windowOpened(WindowEvent e) {}<br />
}<br />
</code></p>
]]></content:encoded>
	</item>
	<item>
		<title>By: blackcat3713</title>
		<link>http://www.javenue.info/post/66#comment-19495</link>
		<author>blackcat3713</author>
		<pubDate>Tue, 06 Nov 2007 16:05:47 +0000</pubDate>
		<guid>http://www.javenue.info/post/66#comment-19495</guid>
		<description>еще одна фича)) граничит уже с хаком))

окошко это "видит" eclipse сквозь другие приложения, как рентген)

автору респект за такую штуку)) пошел дальше играцца)

скриншот делается один раз при создании окна, на все остальные изменения окошку “всеравно”. халтура) скриншот надо делать при каждом repaint. ушел переписывать окошко)</description>
		<content:encoded><![CDATA[<p>еще одна фича)) граничит уже с хаком))</p>
<p>окошко это &#8220;видит&#8221; eclipse сквозь другие приложения, как рентген)</p>
<p>автору респект за такую штуку)) пошел дальше играцца)</p>
<p>скриншот делается один раз при создании окна, на все остальные изменения окошку “всеравно”. халтура) скриншот надо делать при каждом repaint. ушел переписывать окошко)</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: blackcat3713</title>
		<link>http://www.javenue.info/post/66#comment-19494</link>
		<author>blackcat3713</author>
		<pubDate>Tue, 06 Nov 2007 16:02:48 +0000</pubDate>
		<guid>http://www.javenue.info/post/66#comment-19494</guid>
		<description>попробовал окошко в действии)) немного подтормаживает, но в принципе неплохо)

один вопрос автору..
у меня это окошко не видит (т.е. я на экране вижу эти элементы, а оно показывает как будто их нет!) элементы: собственную закладку в панели задач, закладку диспетчера задач, иконку диспетчера задач в трее.

и! самое интересное!) показывает скрытые мной иконки в Eclipse! т.е. иконки я скрыл (а окошко их на старом месте показывает (= )

на экране их ясный пень не видно))

как автор может это прокомментировать? ведь за основу должен браться "скриншот", а винда похоже подсовывает что-то левое</description>
		<content:encoded><![CDATA[<p>попробовал окошко в действии)) немного подтормаживает, но в принципе неплохо)</p>
<p>один вопрос автору..<br />
у меня это окошко не видит (т.е. я на экране вижу эти элементы, а оно показывает как будто их нет!) элементы: собственную закладку в панели задач, закладку диспетчера задач, иконку диспетчера задач в трее.</p>
<p>и! самое интересное!) показывает скрытые мной иконки в Eclipse! т.е. иконки я скрыл (а окошко их на старом месте показывает (= )</p>
<p>на экране их ясный пень не видно))</p>
<p>как автор может это прокомментировать? ведь за основу должен браться &#8220;скриншот&#8221;, а винда похоже подсовывает что-то левое</p>
]]></content:encoded>
	</item>
</channel>
</rss>
