Transparente Fenster

Status
Nicht offen für weitere Antworten.

VdA

Bekanntes Mitglied
Weiß jemand wie man Fenster halb-durchsichtig macht?
Ich hab schon probiert mit
Code:
Color rot= new Color(255, 255, 138, 0) ;
getContentPane().setBackground(rot );
geht aber nicht, das fenster ist nur weiß.
 
Das ist defakto mit Java nicht möglich. Du kannst jediglich einen Screenshot machen und als Hintergrundbild in dein Frame einsetzen...
 
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
 
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)):
Code:
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:
Code:
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
			
		}		
	};
}
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben