# Transparente Fenster



## VdA (27. Sep 2006)

Weiß jemand wie man Fenster halb-durchsichtig macht?
Ich hab schon probiert mit 

```
Color rot= new Color(255, 255, 138, 0) ;
getContentPane().setBackground(rot );
```
geht aber nicht, das fenster ist nur weiß.


----------



## Campino (27. Sep 2006)

Das ist defakto mit Java nicht möglich. Du kannst jediglich einen Screenshot machen und als Hintergrundbild in dein Frame einsetzen...


----------



## VdA (27. Sep 2006)

Danke, schade irgendwie, aber nagut.


----------



## Spacerat (3. Okt 2008)

Hallo...

Geht nicht gibts nicht... Hat mein Meister immer gesagt!

In diesem Fall wäre es doch denkbar, den Screenshot in ein BufferedImage zu packen und den benötigten Bereich mit dem gewünschtem "rot" filtert.

mfg Spacerat


----------



## Netscanner Waldi (3. Okt 2008)

Ich hab da mal ein wenig geforscht und eine kleine Testanwendung geschrieben, ist noch stark verbesserungswürdig, aber ein Anfang für weitere Nachforschungen. Beispielsweise könnte man den Frame auf setUndecorated(true) setzen und einen eigenen Fensterrahmen zeichnen.

Zuerst ein JPanel, dem man ein Hintergrundbild samt Alpha-Wert übergeben kann (setBackground(Image, Alpha)):

```
import java.awt.AlphaComposite;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;

import javax.swing.JPanel;

public class MyPanel extends JPanel
{
	private static final long serialVersionUID = 1L;		
	private Image backgroundImage = null;
	private float alpha = 1.0f;
		
	/**
	 * Set background image
	 * @param image
	 */
	public void setBackground(Image image)
	{
		if(image != null)
		{
			this.backgroundImage = image;
			setOpaque(false);			
		}						
	}	
	
	/**
	 * Set background image with alpha overlay
	 * @param image
	 * @param alpha 0.0f to 1.0f
	 */
	public void setBackground(Image image, float alpha)
	{
		if(image != null)
		{
			this.backgroundImage = image;
			this.alpha = alpha;
			setOpaque(false);			
		}		
	}	
		
	@Override
	protected void paintComponent(Graphics g)
	{
		Graphics2D g2 = (Graphics2D)g;
		
		//image
		if(backgroundImage != null)
		{			
			//set alpha 
			AlphaComposite ac;			
			if(alpha < 1.0f)
			{
				ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, alpha);
				g2.setComposite(ac);
			}
			
			//draw image
			g2.drawImage(backgroundImage, 0, 0, getBounds().width, getBounds().height, null);
						
			//restore old  alpha for painting other components 
			if(alpha < 1.0f)
			{
				ac = AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 1.0f);
				g2.setComposite(ac);
			}
		}
			
		//paint other components
		super.paintComponent(g);
	}
}
```

Danach die eigentliche Testanwendung:

```
package de.greenwaysystems.stauconCompact.controlServer.test;

import java.awt.AWTException;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.Toolkit;
import java.awt.event.ComponentEvent;
import java.awt.event.ComponentListener;
import java.awt.image.BufferedImage;

import javax.swing.JFrame;

public class TestTransparentBackground
{
	private BufferedImage image;
	
	//own Panel with changeable background  
	private MyPanel panel;
	
	private JFrame frame;
	private BufferedImage area;
	
	public TestTransparentBackground() throws AWTException
	{
		frame = new JFrame();
		frame.setSize(new Dimension(800,600));
		frame.setLayout(new BorderLayout());
		frame.addComponentListener(componentListener);
		frame.setUndecorated(false);
		
		panel = new MyPanel();
		frame.add(panel, BorderLayout.CENTER);
		
		//Take Screenshot
		Toolkit toolkit = Toolkit.getDefaultToolkit();
		Dimension screenSize = toolkit.getScreenSize();
		Rectangle screenRect = new Rectangle(screenSize);
		// create screen shot
		Robot robot = new Robot();
		image = robot.createScreenCapture(screenRect);
		
		//get rectangle area from screenshot
		area = image.getSubimage(frame.getX(), frame.getY(), frame.getWidth(), frame.getHeight());
		panel.setBackground(area, 0.2f);
		
		frame.setVisible(true);
	}
	
	/**
	 * @param args
	 */
	public static void main(String[] args)
	{
		try
		{
			new TestTransparentBackground();
			
		} catch (AWTException e)
		{
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
	
	//Listener to update background image if frame change position	
	ComponentListener componentListener = new ComponentListener(){

		@Override
		public void componentHidden(ComponentEvent e)
		{
			// TODO Auto-generated method stub
			
		}

		@Override
		public void componentMoved(ComponentEvent e)
		{
			if(e.getSource().equals(frame))
			{
				//get rectangle area from screenshot
				area = image.getSubimage(frame.getX(), frame.getY(), frame.getWidth(), frame.getHeight());
				panel.setBackground(area, 0.7f);
				panel.updateUI();
			}
			
		}

		@Override
		public void componentResized(ComponentEvent e)
		{
			if(e.getSource().equals(frame))
			{
				//get rectangle area from screenshot
				area = image.getSubimage(frame.getX(), frame.getY(), frame.getWidth(), frame.getHeight());
				panel.setBackground(area, 0.7f);
				panel.updateUI();
			}
		}

		@Override
		public void componentShown(ComponentEvent e)
		{
			// TODO Auto-generated method stub
			
		}		
	};
}
```


----------



## André Uhres (4. Okt 2008)

VdA hat gesagt.:
			
		

> Weiß jemand wie man Fenster halb-durchsichtig macht?


Eine der Haupteigenschaften, die in der Freigabe von Java Se-6u10 eingeführt werden, ist die Fähigkeit, 
durchlässige und geformte Fenster herzustellen: How to Create Translucent and Shaped Windows


----------

